diff --git a/CHANGELOG.md b/CHANGELOG.md index 494f632..4c9856d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,21 @@ All notable changes to `@red-hat-developer-hub/cli` are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 3.0.0 - 2026-09-14 + +### Changed + +- **Frontend plugin export:** Frontend plugins now use Backstage standard module federation exclusively. The generated remote assets are written to `dist/`, including `dist/remoteEntry.js`. +- Removed the frontend export options `--scalprum-config`, `--generate-scalprum-assets`, `--no-generate-scalprum-assets`, `--generate-module-federation-assets`, and `--no-generate-module-federation-assets`. Frontend module-federation assets are now always generated during `plugin export`. +- Removed the legacy Scalprum frontend bundler and the `plugin build` and `plugin start` commands. +- Frontend dynamic packages no longer contain `dist-scalprum/`, `plugin-manifest.json`, or a `scalprum` package manifest field. + +### Migration + +- Remove the deleted frontend export options from scripts and CI jobs. +- Update integrations that read `dist-scalprum/plugin-manifest.json` to use the standard module-federation output under `dist/` and NFS metadata in `backstage.features`. +- Remove `dist-scalprum` and related glob entries from frontend plugin `files` fields and clean any checked-in legacy output before exporting with rhdh-cli 3.0.0. + ## 2.0.6 - 2026-09-11 ### Added diff --git a/README.md b/README.md index 1527ac6..d9880ae 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,17 @@ This new CLI aims to offer more flexibility and ease of use compared to the prev > | `npx @janus-idp/cli package package-dynamic-plugins` | `npx @red-hat-developer-hub/cli plugin package` | +## Migrating to 3.0.0 + +Version 3.0.0 is a breaking release for frontend plugin export. Scalprum support has been removed and frontend exports now use Backstage standard module federation and NFS metadata only. + +Update frontend plugin scripts and CI jobs as follows: + +- Remove `--scalprum-config`, `--generate-scalprum-assets`, `--no-generate-scalprum-assets`, `--generate-module-federation-assets`, and `--no-generate-module-federation-assets` from `rhdh-cli plugin export` invocations. Standard module-federation assets are now generated automatically. +- Replace consumers of `dist-scalprum/plugin-manifest.json` with the generated assets under `dist/`, including `dist/remoteEntry.js`, and use `backstage.features` for NFS feature metadata. +- Remove `dist-scalprum` and related glob entries from frontend plugin `files` fields. Delete any checked-in or stale `dist-scalprum` output before exporting. +- The legacy `plugin build` and `plugin start` commands are no longer available. + ## `plugin package` requirements The `plugin package` command stages each `dist-dynamic` plugin with `npm pack` and `tar` (via a short bash script). The following must be available on your `PATH`: diff --git a/e2e-tests/community-plugins-build-package.test.ts b/e2e-tests/community-plugins-build-package.test.ts index 220b14c..1fb645f 100644 --- a/e2e-tests/community-plugins-build-package.test.ts +++ b/e2e-tests/community-plugins-build-package.test.ts @@ -110,13 +110,9 @@ describe('export and package backstage-community plugin', () => { // eslint-disable-next-line jest/no-conditional-expect expect( fs.existsSync( - path.join( - getFullPluginPath(), - 'dist-dynamic/dist-scalprum/plugin-manifest.json', - ), + path.join(getFullPluginPath(), 'dist-dynamic/dist/remoteEntry.js'), ), ).toEqual(true); - const distDynamicPkg = JSON.parse( fs.readFileSync( path.join(getFullPluginPath(), 'dist-dynamic/package.json'), diff --git a/e2e-tests/rhdh-plugins-build-package.test.ts b/e2e-tests/rhdh-plugins-build-package.test.ts index 2b95246..201b762 100644 --- a/e2e-tests/rhdh-plugins-build-package.test.ts +++ b/e2e-tests/rhdh-plugins-build-package.test.ts @@ -110,13 +110,9 @@ describe('export and package rhdh-plugins scorecard workspace plugin', () => { // eslint-disable-next-line jest/no-conditional-expect expect( fs.existsSync( - path.join( - getFullPluginPath(), - 'dist-dynamic/dist-scalprum/plugin-manifest.json', - ), + path.join(getFullPluginPath(), 'dist-dynamic/dist/remoteEntry.js'), ), ).toEqual(true); - const distDynamicPkg = JSON.parse( fs.readFileSync( path.join(getFullPluginPath(), 'dist-dynamic/package.json'), diff --git a/package.json b/package.json index 16af1f8..f6dd436 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@red-hat-developer-hub/cli", "description": "CLI for developing Backstage plugins and apps", - "version": "2.0.6", + "version": "3.0.0", "publishConfig": { "access": "public" }, @@ -51,51 +51,27 @@ "@backstage/release-manifests": "~0.0.13", "@backstage/types": "~1.2.2", "@manypkg/get-packages": "^1.1.3", - "@openshift/dynamic-plugin-sdk-webpack": "^3.0.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.6.0", - "@svgr/webpack": "^6.5.1", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "^3.0.0-rc.4", - "bfj": "^9.0.2", "chalk": "^4.0.0", - "chokidar": "^3.3.1", "codeowners": "^5.1.1", "commander": "^9.1.0", - "css-loader": "^6.5.1", - "esbuild": "^0.28.1", - "esbuild-loader": "^4.0.0", "eslint": "8.57.1", "eslint-config-prettier": "^9.0.0", - "eslint-webpack-plugin": "^4.2.0", - "fork-ts-checker-webpack-plugin": "^9.0.0", "fs-extra": "^11.2.0", "gitconfiglocal": "2.1.0", "handlebars": "^4.7.7", - "html-webpack-plugin": "~5.6.3", "is-native-module": "^1.1.3", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.4.2", - "node-stdlib-browser": "^1.3.1", "npm-packlist": "^5.0.0", "ora": "^5.3.0", - "postcss": "^8.2.13", - "react-dev-utils": "^12.0.0-next.60", - "react-refresh": "^0.18.0", "recursive-readdir": "^2.2.2", "semver": "^7.5.4", - "style-loader": "^3.3.1", - "swc-loader": "^0.2.3", "typescript": "5.4.5", "typescript-json-schema": "^0.64.0", - "webpack": "~5.105.0", - "webpack-dev-server": "^5.0.0", - "yaml": "^2.5.1", - "yml-loader": "^2.1.0", - "yn": "^4.0.0" + "yaml": "^2.5.1" }, "devDependencies": { "@backstage/cli-module-test-jest": "0.1.3", - "@backstage/core-plugin-api": "~1.12.7", "@backstage/eslint-plugin": "~0.3.1", "@backstage/repo-tools": "~0.17.3", "@jest/globals": "^30.0.0-beta.3", diff --git a/src/commands/build/buildFrontend.ts b/src/commands/build/buildFrontend.ts deleted file mode 100644 index caf32ae..0000000 --- a/src/commands/build/buildFrontend.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { PluginBuildMetadata } from '@openshift/dynamic-plugin-sdk-webpack'; -import fs from 'fs-extra'; - -import { resolve as resolvePath } from 'path'; - -import { buildBundle } from '../../lib/bundler'; -import { loadCliConfig } from '../../lib/config'; -import { getEnvironmentParallelism } from '../../lib/parallel'; - -interface BuildAppOptions { - targetDir: string; - writeStats: boolean; - configPaths: string[]; - pluginMetadata?: PluginBuildMetadata; -} - -/* - * A variant of buildFrontend that adds plugin metadata to support dynamic - * frontend plugins. - */ -export async function buildFrontend(options: BuildAppOptions) { - const { targetDir, writeStats, configPaths, pluginMetadata } = options; - const { name } = await fs.readJson(resolvePath(targetDir, 'package.json')); - await buildBundle({ - targetDir, - entry: 'src/index', - parallelism: getEnvironmentParallelism(), - statsJsonEnabled: writeStats, - pluginMetadata, - ...(await loadCliConfig({ - args: configPaths, - fromPackage: name, - })), - }); -} diff --git a/src/commands/build/command.ts b/src/commands/build/command.ts deleted file mode 100644 index 4024575..0000000 --- a/src/commands/build/command.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { OptionValues } from 'commander'; - -import { paths } from '../../lib/paths'; -import { findRoleFromCommand } from '../../lib/role'; -import { isValidUrl } from '../../lib/urls'; -import { buildFrontend } from './buildFrontend'; - -/** - * A simplified build command as compared to `@backstage/cli package build` - * that only builds frontend packages. This command is used to build the - * RHDH frontend app in `packages/app` as it adds the build configuration for - * webpack module federation support via Scalprum. - */ -export async function command(opts: OptionValues): Promise { - const role = await findRoleFromCommand(opts); - - const configPaths = (opts.config as string[]).map(arg => { - if (isValidUrl(arg)) { - return arg; - } - return paths.resolveTarget(arg); - }); - - if (role === 'frontend') { - return buildFrontend({ - targetDir: paths.targetDir, - configPaths, - writeStats: Boolean(opts.stats), - }); - } - - throw new Error( - "Package role not supported, please use 'backstage-cli' instead", - ); -} diff --git a/src/commands/build/index.ts b/src/commands/build/index.ts deleted file mode 100644 index 680fe9e..0000000 --- a/src/commands/build/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2022 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export { command } from './command'; diff --git a/src/commands/export-dynamic-plugin/command.ts b/src/commands/export-dynamic-plugin/command.ts index 06bac89..27b79ac 100644 --- a/src/commands/export-dynamic-plugin/command.ts +++ b/src/commands/export-dynamic-plugin/command.ts @@ -49,18 +49,10 @@ export async function command(opts: OptionValues): Promise { ]; } else if (role === 'frontend-plugin' || role === 'frontend-plugin-module') { targetPath = await frontend(roleInfo, opts); - configSchemaPaths = []; - if (fs.existsSync(path.join(targetPath, 'dist-scalprum'))) { - configSchemaPaths.push( - path.join(targetPath, 'dist-scalprum/configSchema.json'), - ); - } - if (fs.existsSync(path.join(targetPath, 'dist'))) { - configSchemaPaths.push(path.join(targetPath, 'dist/.config-schema.json')); - } + configSchemaPaths = [path.join(targetPath, 'dist/.config-schema.json')]; } else { throw new Error( - 'Only packages with the "backend-plugin", "backend-plugin-module" or "frontend-plugin" roles can be exported as dynamic backend plugins', + 'Only packages with the "backend-plugin", "backend-plugin-module", "frontend-plugin" or "frontend-plugin-module" roles can be exported as dynamic plugins', ); } diff --git a/src/commands/export-dynamic-plugin/frontend.ts b/src/commands/export-dynamic-plugin/frontend.ts index f5c0960..b1653a0 100644 --- a/src/commands/export-dynamic-plugin/frontend.ts +++ b/src/commands/export-dynamic-plugin/frontend.ts @@ -24,7 +24,6 @@ import fs from 'fs-extra'; import path from 'path'; -import { buildScalprumPlugin } from '../../lib/builder/buildScalprumPlugin'; import { productionPack } from '../../lib/packager/productionPack'; import { paths } from '../../lib/paths'; import { Task } from '../../lib/tasks'; @@ -44,43 +43,56 @@ export async function frontend( opts: OptionValues, ): Promise { const originalPkg = await fs.readJson(paths.resolveTarget('package.json')); - const { name, version, scalprum: scalprumInline, files } = originalPkg; + const { name, files } = originalPkg; - if (!opts.generateScalprumAssets && !opts.generateModuleFederationAssets) { + if ('scalprum' in originalPkg) { throw new Error( - 'You should use at least one of the 2 options: --generate-scalprum-assets or --generate-module-federation-assets.', + 'Frontend plugin export no longer supports the `scalprum` package field; remove it before exporting', ); } - if (opts.generateModuleFederationAssets) { - if (opts.clean) { - await fs.remove(path.join(paths.targetDir, 'dist')); - } + const legacyScalprumFile = Array.isArray(files) + ? files.find((file: string) => file.includes('dist-scalprum')) + : undefined; + if (legacyScalprumFile) { + throw new Error( + `Frontend plugin export no longer supports Scalprum files; remove \`${legacyScalprumFile}\` before exporting`, + ); + } - Task.log( - `Generating standard module federation assets in ${chalk.cyan( - path.join(paths.targetDir, 'dist'), - )}`, + if (await fs.pathExists(path.join(paths.targetDir, 'dist-scalprum'))) { + throw new Error( + 'Frontend plugin export no longer supports the `dist-scalprum` directory; remove it before exporting', ); - const previousCi = process.env.CI; - const unsetCiForMfBuild = isTruthyCiEnv(previousCi); + } + + if (opts.clean) { + await fs.remove(path.join(paths.targetDir, 'dist')); + } + + Task.log( + `Generating standard module federation assets in ${chalk.cyan( + path.join(paths.targetDir, 'dist'), + )}`, + ); + const previousCi = process.env.CI; + const unsetCiForMfBuild = isTruthyCiEnv(previousCi); + if (unsetCiForMfBuild) { + process.env.CI = 'false'; + } + try { + await buildFrontend({ + targetDir: paths.targetDir, + configPaths: [], + writeStats: false, + isModuleFederationRemote: true, + }); + } finally { if (unsetCiForMfBuild) { - process.env.CI = 'false'; - } - try { - await buildFrontend({ - targetDir: paths.targetDir, - configPaths: [], - writeStats: false, - isModuleFederationRemote: true, - }); - } finally { - if (unsetCiForMfBuild) { - if (previousCi === undefined) { - delete process.env.CI; - } else { - process.env.CI = previousCi; - } + if (previousCi === undefined) { + delete process.env.CI; + } else { + process.env.CI = previousCi; } } } @@ -115,17 +127,10 @@ export async function frontend( path.join(distDynamicRelativePath, 'package.json'), )} for dynamic loading`, ); - if ( - files && - Array.isArray(files) && - !files.includes('dist-scalprum') && - opts.generateScalprumAssets - ) { - files.push('dist-scalprum'); - } - const detectedFeatures = opts.generateModuleFederationAssets - ? await detectBackstageFeatures(originalPkg, paths.targetDir) - : undefined; + const detectedFeatures = await detectBackstageFeatures( + originalPkg, + paths.targetDir, + ); const monoRepoPackages = await getPackages(paths.targetDir); @@ -146,66 +151,13 @@ export async function frontend( files, }, rootResolutions, - after: detectedFeatures - ? pkg => { - pkg.backstage = pkg.backstage ?? {}; - pkg.backstage.features = detectedFeatures; - } - : undefined, - })(path.resolve(target, 'package.json')); - - if (opts.generateScalprumAssets) { - const resolvedScalprumDistPath = path.join(target, 'dist-scalprum'); - Task.log( - `Generating dynamic frontend plugin assets in ${chalk.cyan( - resolvedScalprumDistPath, - )}`, - ); - - let scalprum: any = undefined; - if (opts.scalprumConfig) { - const scalprumConfigFile = paths.resolveTarget(opts.scalprumConfig); - Task.log( - `Using external scalprum config file: ${chalk.cyan(scalprumConfigFile)}`, - ); - scalprum = await fs.readJson(scalprumConfigFile); - } else if (scalprumInline) { - Task.log(`Using scalprum config inlined in the 'package.json'`); - scalprum = scalprumInline; - } else { - let scalprumName; - if (name.includes('/')) { - const fragments = name.split('/'); - scalprumName = `${fragments[0].replace('@', '')}.${fragments[1]}`; - } else { - scalprumName = name; + after: pkg => { + if (detectedFeatures) { + pkg.backstage = pkg.backstage ?? {}; + pkg.backstage.features = detectedFeatures; } - scalprum = { - name: scalprumName, - exposedModules: { - PluginRoot: './src/index.ts', - }, - }; - Task.log(`No scalprum config. Using default dynamic UI configuration:`); - Task.log(chalk.cyan(JSON.stringify(scalprum, null, 2))); - Task.log( - `If you wish to change the defaults, add "scalprum" configuration to plugin "package.json" file, or use the '--scalprum-config' option to specify an external config.`, - ); - } - - await fs.remove(resolvedScalprumDistPath); - - await buildScalprumPlugin({ - writeStats: false, - configPaths: [], - targetDir: paths.targetDir, - pluginMetadata: { - ...scalprum, - version, - }, - resolvedScalprumDistPath, - }); - } + }, + })(path.resolve(target, 'package.json')); return target; } diff --git a/src/commands/index.ts b/src/commands/index.ts index 3fbb95c..f56f14f 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -77,27 +77,11 @@ export function registerPluginCommand(program: Command) { '--dynamic-plugins-root ', 'Provides the dynamic plugins root folder when the dynamic plugins content should be copied when using the `--dev` argument.', ) - .option( - '--scalprum-config ', - 'Allows retrieving scalprum configuration from an external JSON file, instead of using a `scalprum` field of the `package.json`. Frontend plugins only.', - ) .option( '--track-dynamic-manifest-and-lock-file', 'Adds the `package.json` and `yarn.lock` files, generated in the `dist-dynamic` folder of backend plugins, to source control. By default the whole `dist-dynamic` folder id git-ignored.', false, ) - .option( - '--generate-scalprum-assets', - 'Generate the dynamic frontend plugin assets through Scalprum in the `dist-scalprum` folder.', - true, - ) - .option('--no-generate-scalprum-assets', '', false) - .option( - '--generate-module-federation-assets', - 'Generate the dynamic frontend plugin assets through standard module federation in the `dist` folder.', - true, - ) - .option('--no-generate-module-federation-assets', '', false) .action(lazy(() => import('./export-dynamic-plugin').then(m => m.command))); command diff --git a/src/commands/start/command.ts b/src/commands/start/command.ts deleted file mode 100644 index 6ccd026..0000000 --- a/src/commands/start/command.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { OptionValues } from 'commander'; - -import { findRoleFromCommand } from '../../lib/role'; -import { startFrontend } from './startFrontend'; - -/** - * This version of the "package start" command is used to start the RHDH - * frontend in packages/app. It is simplified from the "@backstage/cli package - * start" command to remove support for starting the backend package. - */ -export async function command(opts: OptionValues): Promise { - const role = await findRoleFromCommand(opts); - - const options = { - configPaths: opts.config as string[], - checksEnabled: Boolean(opts.check), - inspectEnabled: Boolean(opts.inspect), - inspectBrkEnabled: Boolean(opts.inspectBrk), - }; - - switch (role) { - case 'frontend': - return startFrontend({ - ...options, - entry: 'src/index', - verifyVersions: true, - }); - case 'web-library': - case 'frontend-plugin': - case 'frontend-plugin-module': - return startFrontend({ entry: 'dev/index', ...options }); - default: - throw new Error( - `Start command is not supported for package role '${role}'`, - ); - } -} diff --git a/src/commands/start/index.ts b/src/commands/start/index.ts deleted file mode 100644 index 680fe9e..0000000 --- a/src/commands/start/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2022 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export { command } from './command'; diff --git a/src/commands/start/startFrontend.ts b/src/commands/start/startFrontend.ts deleted file mode 100644 index a809473..0000000 --- a/src/commands/start/startFrontend.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { serveBundle } from '../../lib/bundler'; - -interface StartAppOptions { - verifyVersions?: boolean; - entry: string; - - checksEnabled: boolean; - configPaths: string[]; -} - -export async function startFrontend(options: StartAppOptions) { - const waitForExit = await serveBundle({ - entry: options.entry, - checksEnabled: options.checksEnabled, - configPaths: options.configPaths, - verifyVersions: options.verifyVersions, - }); - - await waitForExit(); -} diff --git a/src/lib/builder/buildScalprumPlugin.ts b/src/lib/builder/buildScalprumPlugin.ts deleted file mode 100644 index 6949c7e..0000000 --- a/src/lib/builder/buildScalprumPlugin.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { PluginBuildMetadata } from '@openshift/dynamic-plugin-sdk-webpack'; - -import { buildScalprumBundle } from '../bundler/bundlePlugin'; -import { getEnvironmentParallelism } from '../parallel'; - -interface BuildScalprumPluginOptions { - targetDir: string; - writeStats: boolean; - configPaths: string[]; - pluginMetadata: PluginBuildMetadata; - resolvedScalprumDistPath: string; -} - -export async function buildScalprumPlugin(options: BuildScalprumPluginOptions) { - const { targetDir, pluginMetadata, resolvedScalprumDistPath } = options; - await buildScalprumBundle({ - targetDir, - entry: 'src/index', - parallelism: getEnvironmentParallelism(), - pluginMetadata, - resolvedScalprumDistPath, - }); -} diff --git a/src/lib/bundler/LinkedPackageResolvePlugin.test.ts b/src/lib/bundler/LinkedPackageResolvePlugin.test.ts deleted file mode 100644 index 2d5d27a..0000000 --- a/src/lib/bundler/LinkedPackageResolvePlugin.test.ts +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as fs from 'node:fs'; -import * as os from 'os'; -import * as path from 'path'; - -import { LinkedPackageResolvePlugin } from './LinkedPackageResolvePlugin'; - -describe('LinkedPackageResolvePlugin', () => { - // Use a temp dir so isChildPath (realpathSync) can access paths; /root may be inaccessible (EACCES). - const root = path.join( - os.tmpdir(), - `linked-package-resolve-plugin-test-${Date.now()}`, - ); - - beforeAll(() => { - const dirs = [ - path.join(root, 'external-a'), - path.join(root, 'external-a/src'), - path.join(root, 'external-b'), - path.join(root, 'external-b/src'), - path.join(root, 'external-aa'), - path.join(root, 'external-aa/src'), - path.join(root, 'repo/package/x/src'), - path.join(root, 'repo/node_modules'), - ]; - for (const dir of dirs) { - fs.mkdirSync(dir, { recursive: true }); - } - }); - - afterAll(() => { - try { - fs.rmSync(root, { recursive: true }); - } catch { - // ignore cleanup errors - } - }); - - it('should re-write paths for external packages', () => { - const plugin = new LinkedPackageResolvePlugin( - path.resolve(root, 'repo/node_modules'), - [ - { - dir: path.resolve(root, 'external-a'), - packageJson: { - name: 'a', - version: '1.0.0', - }, - }, - { - dir: path.resolve(root, 'external-b'), - packageJson: { - name: '@s/b', - version: '1.0.0', - }, - }, - ], - ); - - const tapAsync = jest.fn(); - const doResolve = jest.fn(); - - const resolver = { - hooks: { resolve: { tapAsync } }, - doResolve, - }; - plugin.apply(resolver); - - expect(tapAsync).toHaveBeenCalledTimes(1); - expect(tapAsync).toHaveBeenCalledWith( - 'LinkedPackageResolvePlugin', - expect.any(Function), - ); - expect(doResolve).toHaveBeenCalledTimes(0); - - // Internal module resolution is not affected - const tap = tapAsync.mock.calls[0][1]; - const callbackX = jest.fn(); - tap( - { - request: path.resolve(root, 'repo/package/x/src/module.ts'), - path: path.resolve(root, 'repo/package/x/src'), - context: { - issuer: path.resolve(root, 'repo/package/x/src/index.ts'), - }, - }, - 'some-context', - callbackX, - ); - expect(callbackX).toHaveBeenCalledTimes(1); - expect(callbackX).toHaveBeenCalledWith(); - expect(doResolve).toHaveBeenCalledTimes(0); - - // Path is sometimes false - const callbackFalse = jest.fn(); - tap( - { - request: 'sample', - path: false, - }, - 'some-context', - callbackFalse, - ); - expect(callbackFalse).toHaveBeenCalledTimes(1); - expect(callbackFalse).toHaveBeenCalledWith(); - expect(doResolve).toHaveBeenCalledTimes(0); - - // Internal modules with a path prefix of an external module - const callbackY = jest.fn(); - tap( - { - request: path.resolve(root, 'external-aa/src/module.ts'), - path: path.resolve(root, 'external-aa/src'), - context: { - issuer: path.resolve(root, 'external-aa/src/index.ts'), - }, - }, - 'some-context', - callbackY, - ); - expect(callbackY).toHaveBeenCalledTimes(1); - expect(callbackY).toHaveBeenCalledWith(); - expect(doResolve).toHaveBeenCalledTimes(0); - - // External modules have their path and issuer context rewritten, but not the request - const callbackA = jest.fn(); - tap( - { - request: path.resolve(root, 'external-a/src/module.ts'), - path: path.resolve(root, 'external-a/src'), - context: { - issuer: path.resolve(root, 'external-a/src/index.ts'), - }, - }, - 'some-context', - callbackA, - ); - expect(callbackA).toHaveBeenCalledTimes(0); - expect(doResolve).toHaveBeenCalledTimes(1); - expect(doResolve).toHaveBeenCalledWith( - resolver.hooks.resolve, - { - request: path.resolve(root, 'external-a/src/module.ts'), - path: path.resolve(root, 'repo/node_modules/a/src'), - context: { - issuer: path.resolve(root, 'repo/node_modules/a/src/index.ts'), - }, - }, - `resolve ${path.resolve( - root, - 'external-a/src/module.ts', - )} in ${path.resolve(root, 'repo/node_modules/a')}`, - 'some-context', - callbackA, - ); - - // Also handles scoped packages correctly, and issuer is not required - const callbackB = jest.fn(); - tap( - { - request: path.resolve(root, 'external-b/src/module.ts'), - path: path.resolve(root, 'external-b/src'), - context: { - issuer: false, - }, - }, - 'some-context', - callbackB, - ); - expect(callbackB).toHaveBeenCalledTimes(0); - expect(doResolve).toHaveBeenCalledTimes(2); - expect(doResolve).toHaveBeenLastCalledWith( - resolver.hooks.resolve, - { - request: path.resolve(root, 'external-b/src/module.ts'), - path: path.resolve(root, 'repo/node_modules/@s/b/src'), - context: { - issuer: false, - }, - }, - `resolve ${path.resolve( - root, - 'external-b/src/module.ts', - )} in ${path.resolve(root, 'repo/node_modules/@s/b')}`, - 'some-context', - callbackB, - ); - - expect(tapAsync).toHaveBeenCalledTimes(1); - }); -}); diff --git a/src/lib/bundler/LinkedPackageResolvePlugin.ts b/src/lib/bundler/LinkedPackageResolvePlugin.ts deleted file mode 100644 index 933fb30..0000000 --- a/src/lib/bundler/LinkedPackageResolvePlugin.ts +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { isChildPath } from '@backstage/cli-common'; - -import { Package } from '@manypkg/get-packages'; -import { WebpackPluginInstance } from 'webpack'; - -import { resolve as resolvePath } from 'path'; - -// Enables proper resolution of packages when linking in external packages. -// Without this the packages would depend on dependencies in the node_modules -// of the external packages themselves, leading to module duplication -export class LinkedPackageResolvePlugin implements WebpackPluginInstance { - constructor( - private readonly targetModules: string, - private readonly packages: Package[], - ) {} - - apply(resolver: any) { - resolver.hooks.resolve.tapAsync( - 'LinkedPackageResolvePlugin', - ( - data: { - request: string; - path?: false | string; - context?: { issuer?: string }; - }, - context: unknown, - callback: () => void, - ) => { - const pkg = this.packages.find( - pkge => data.path && isChildPath(pkge.dir, data.path), - ); - if (!pkg) { - callback(); - return; - } - - // pkg here is an external package. We rewrite the context of any imports to resolve - // from the location of the package within the node_modules of the target root rather - // than the real location of the external package. - const modulesLocation = resolvePath( - this.targetModules, - pkg.packageJson.name, - ); - const newContext = data.context?.issuer - ? { - ...data.context, - issuer: data.context.issuer.replace(pkg.dir, modulesLocation), - } - : data.context; - - // Re-run resolution but this time from the point of view of our target monorepo rather - // than the location of the external package. By resolving modules using this method we avoid - // pulling in e.g. `react` from the external repo, which would otherwise lead to conflicts. - resolver.doResolve( - resolver.hooks.resolve, - { - ...data, - context: newContext, - path: data.path && data.path.replace(pkg.dir, modulesLocation), - }, - `resolve ${data.request} in ${modulesLocation}`, - context, - callback, - ); - }, - ); - } -} diff --git a/src/lib/bundler/bundle.ts b/src/lib/bundler/bundle.ts deleted file mode 100644 index 23cfdff..0000000 --- a/src/lib/bundler/bundle.ts +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - measureFileSizesBeforeBuild, - printFileSizesAfterBuild, -} from 'react-dev-utils/FileSizeReporter'; -import formatWebpackMessages from 'react-dev-utils/formatWebpackMessages'; - -import chalk from 'chalk'; -import fs from 'fs-extra'; -import webpack from 'webpack'; -import yn from 'yn'; - -import { resolve as resolvePath } from 'path'; - -import { createConfig, resolveBaseUrl } from './config'; -import { createDetectedModulesEntryPoint } from './packageDetection'; -import { resolveBundlingPaths } from './paths'; -import { BuildOptions } from './types'; - -// TODO(Rugvip): Limits from CRA, we might want to tweak these though. -const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024; -const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024; - -function applyContextToError(error: string, moduleName: string): string { - return `Failed to compile '${moduleName}':\n ${error}`; -} - -export async function buildBundle(options: BuildOptions) { - const { statsJsonEnabled, schema: configSchema } = options; - - const paths = resolveBundlingPaths(options); - - const detectedModulesEntryPoint = await createDetectedModulesEntryPoint({ - config: options.fullConfig, - targetPath: paths.targetPath, - }); - - const config = await createConfig(paths, { - ...options, - checksEnabled: false, - isDev: false, - baseUrl: resolveBaseUrl(options.frontendConfig), - getFrontendAppConfigs: () => options.frontendAppConfigs, - additionalEntryPoints: detectedModulesEntryPoint, - }); - - const isCi = yn(process.env.CI, { default: false }); - - const previousFileSizes = await measureFileSizesBeforeBuild(paths.targetDist); - await fs.emptyDir(paths.targetDist); - - if (paths.targetPublic) { - await fs.copy(paths.targetPublic, paths.targetDist, { - dereference: true, - filter: file => file !== paths.targetHtml, - }); - } - - if (configSchema) { - await fs.writeJson( - resolvePath(paths.targetDist, '.config-schema.json'), - configSchema.serialize(), - { spaces: 2 }, - ); - } - - const { stats } = await build(config, isCi); - - if (!stats) { - throw new Error('No stats returned'); - } - - if (statsJsonEnabled) { - // No @types/bfj - await require('bfj').write( - resolvePath(paths.targetDist, 'bundle-stats.json'), - stats.toJson(), - ); - } - - printFileSizesAfterBuild( - stats, - previousFileSizes, - paths.targetDist, - WARN_AFTER_BUNDLE_GZIP_SIZE, - WARN_AFTER_CHUNK_GZIP_SIZE, - ); -} - -async function build(config: webpack.Configuration, isCi: boolean) { - const stats = await new Promise( - (resolve, reject) => { - webpack(config, (err, buildStats) => { - if (err) { - if (err.message) { - const { errors } = formatWebpackMessages({ - errors: [err.message], - warnings: new Array(), - _showErrors: true, - _showWarnings: true, - }); - - throw new Error(errors[0]); - } else { - reject(err); - } - } else { - resolve(buildStats); - } - }); - }, - ); - - if (!stats) { - throw new Error('Failed to compile: No stats provided'); - } - - const serializedStats = stats.toJson({ - all: false, - warnings: true, - errors: true, - }); - const { errors, warnings } = formatWebpackMessages({ - errors: serializedStats.errors, - warnings: serializedStats.warnings, - }); - - if (errors.length) { - // Only keep the first error. Others are often indicative - // of the same problem, but confuse the reader with noise. - const errorWithContext = applyContextToError( - errors[0], - serializedStats.errors?.[0]?.moduleName ?? '', - ); - throw new Error(errorWithContext); - } - if (isCi && warnings.length) { - const warningsWithContext = warnings.map((warning, i) => { - return applyContextToError( - warning, - serializedStats.warnings?.[i]?.moduleName ?? '', - ); - }); - console.log( - chalk.yellow( - '\nTreating warnings as errors because process.env.CI = true.\n', - ), - ); - throw new Error(warningsWithContext.join('\n\n')); - } - - return { stats }; -} diff --git a/src/lib/bundler/bundlePlugin.ts b/src/lib/bundler/bundlePlugin.ts deleted file mode 100644 index f1cdc66..0000000 --- a/src/lib/bundler/bundlePlugin.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { - measureFileSizesBeforeBuild, - printFileSizesAfterBuild, -} from 'react-dev-utils/FileSizeReporter'; -import formatWebpackMessages from 'react-dev-utils/formatWebpackMessages'; - -import chalk from 'chalk'; -import fs from 'fs-extra'; -import webpack from 'webpack'; -import yn from 'yn'; - -import { BundlingPathsOptions, resolveBundlingPaths } from './paths'; -import { createScalprumConfig } from './scalprumConfig'; -import { DynamicPluginOptions } from './types'; - -// TODO(Rugvip): Limits from CRA, we might want to tweak these though. -const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024; -const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024; - -function applyContextToError(error: string, moduleName: string): string { - return `Failed to compile '${moduleName}':\n ${error}`; -} - -export async function buildScalprumBundle( - options: BundlingPathsOptions & - DynamicPluginOptions & { - resolvedScalprumDistPath: string; - }, -) { - const paths = resolveBundlingPaths(options); - const config = await createScalprumConfig( - { - targetScalprumDist: options.resolvedScalprumDistPath, - ...paths, - }, - { - ...options, - checksEnabled: false, - isDev: false, - }, - ); - - const isCi = yn(process.env.CI, { default: false }); - - const previousFileSizes = await measureFileSizesBeforeBuild( - options.resolvedScalprumDistPath, - ); - await fs.emptyDir(options.resolvedScalprumDistPath); - - // TODO(davidfestal): ask @tumido or @Hyperkid123if this still makes sense here for dynamic plugins. - // That seems strange since the public assets are not copied to `dist-scalprum`, - // which is the place from where the dynamic plugin assets will be served - if (paths.targetPublic) { - await fs.copy(paths.targetPublic, paths.targetDist, { - dereference: true, - filter: file => file !== paths.targetHtml, - }); - } - - const { stats } = await build(config, isCi); - - if (!stats) { - throw new Error('No stats returned'); - } - - printFileSizesAfterBuild( - stats, - previousFileSizes, - options.resolvedScalprumDistPath, - WARN_AFTER_BUNDLE_GZIP_SIZE, - WARN_AFTER_CHUNK_GZIP_SIZE, - ); -} - -async function build(config: webpack.Configuration, isCi: boolean) { - const stats = await new Promise( - (resolve, reject) => { - webpack(config, (err, buildStats) => { - if (err) { - if (err.message) { - const { errors } = formatWebpackMessages({ - errors: [err.message], - warnings: new Array(), - _showErrors: true, - _showWarnings: true, - }); - - throw new Error(errors[0]); - } else { - reject(err); - } - } else { - resolve(buildStats); - } - }); - }, - ); - - if (!stats) { - throw new Error('Failed to compile: No stats provided'); - } - - const serializedStats = stats.toJson({ - all: false, - warnings: true, - errors: true, - }); - const { errors, warnings } = formatWebpackMessages({ - errors: serializedStats.errors, - warnings: serializedStats.warnings, - }); - - if (errors.length) { - // Only keep the first error. Others are often indicative - // of the same problem, but confuse the reader with noise. - const errorWithContext = applyContextToError( - errors[0], - serializedStats.errors?.[0]?.moduleName ?? '', - ); - throw new Error(errorWithContext); - } - if (isCi && warnings.length) { - const warningsWithContext = warnings.map((warning, i) => { - return applyContextToError( - warning, - serializedStats.warnings?.[i]?.moduleName ?? '', - ); - }); - console.log(chalk.yellow(warningsWithContext.join('\n\n'))); - } - - return { stats }; -} diff --git a/src/lib/bundler/config.ts b/src/lib/bundler/config.ts deleted file mode 100644 index 4094f2d..0000000 --- a/src/lib/bundler/config.ts +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import ModuleScopePlugin from 'react-dev-utils/ModuleScopePlugin'; - -import { isChildPath } from '@backstage/cli-common'; -import { Config } from '@backstage/config'; - -import { getPackages } from '@manypkg/get-packages'; -import ESLintPlugin from 'eslint-webpack-plugin'; -import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'; -import fs from 'fs-extra'; -import HtmlWebpackPlugin from 'html-webpack-plugin'; -import pickBy from 'lodash/pickBy'; -import webpack, { container, ProvidePlugin } from 'webpack'; -import yn from 'yn'; - -import { join as joinPath, resolve as resolvePath } from 'path'; - -import { paths as cliPaths } from '../../lib/paths'; -import { version } from '../../lib/version'; -import { runPlain } from '../run'; -import { LinkedPackageResolvePlugin } from './LinkedPackageResolvePlugin'; -import { optimization } from './optimization'; -import { BundlingPaths } from './paths'; -import { sharedModules } from './scalprumConfig'; -import { transforms } from './transforms'; -import { BundlingOptions } from './types'; - -const { ModuleFederationPlugin } = container; - -const scalprumPlugin = new ModuleFederationPlugin({ - name: 'backstageHost', - filename: 'backstageHost.[fullhash].js', - shared: [sharedModules], -}); - -const BUILD_CACHE_ENV_VAR = 'BACKSTAGE_CLI_EXPERIMENTAL_BUILD_CACHE'; - -export function resolveBaseUrl(config: Config): URL { - const baseUrl = config.getString('app.baseUrl'); - try { - return new URL(baseUrl); - } catch (error) { - throw new Error(`Invalid app.baseUrl, ${error}`); - } -} - -async function readBuildInfo() { - const timestamp = Date.now(); - - let commit = 'unknown'; - try { - commit = await runPlain('git', 'rev-parse', 'HEAD'); - } catch (error) { - console.warn(`WARNING: Failed to read git commit, ${error}`); - } - - let gitVersion = 'unknown'; - try { - gitVersion = await runPlain('git', 'describe', '--always'); - } catch (error) { - console.warn(`WARNING: Failed to describe git version, ${error}`); - } - - const { version: packageVersion } = await fs.readJson( - cliPaths.resolveTarget('package.json'), - ); - - return { - cliVersion: version, - gitVersion, - packageVersion, - timestamp, - commit, - }; -} - -/** - * A version of createConfig that differs from the version in @backstage/cli - * from 1.18.0 by adding the scalprum plugin, cache settings and an alias to - * the webpack config. - */ -export async function createConfig( - paths: BundlingPaths, - options: BundlingOptions, -): Promise { - const { checksEnabled, isDev, frontendConfig } = options; - - const { plugins, loaders } = transforms(options); - // Any package that is part of the monorepo but outside the monorepo root dir need - // separate resolution logic. - const { packages } = await getPackages(cliPaths.targetDir); - const externalPkgs = packages.filter(p => !isChildPath(paths.root, p.dir)); - - const baseUrl = frontendConfig.getString('app.baseUrl'); - const validBaseUrl = new URL(baseUrl); - const publicPath = validBaseUrl.pathname.replace(/\/$/, ''); - if (checksEnabled) { - plugins.push( - new ForkTsCheckerWebpackPlugin({ - typescript: { configFile: paths.targetTsConfig, memoryLimit: 4096 }, - }), - new ESLintPlugin({ - context: paths.targetPath, - files: ['**/*.(ts|tsx|mts|cts|js|jsx|mjs|cjs)'], - }), - ); - } - - // TODO(blam): process is no longer auto polyfilled by webpack in v5. - // we use the provide plugin to provide this polyfill, but lets look - // to remove this eventually! - plugins.push( - new ProvidePlugin({ - process: 'process/browser', - Buffer: ['buffer', 'Buffer'], - }), - ); - - plugins.push( - new HtmlWebpackPlugin({ - template: paths.targetHtml, - templateParameters: { - publicPath, - config: frontendConfig, - }, - }), - ); - - const buildInfo = await readBuildInfo(); - plugins.push( - new webpack.DefinePlugin({ - 'process.env.HAS_REACT_DOM_CLIENT': false, - 'process.env.BUILD_INFO': JSON.stringify(buildInfo), - 'process.env.APP_CONFIG': webpack.DefinePlugin.runtimeValue( - () => JSON.stringify(options.getFrontendAppConfigs()), - true, - ), - }), - ); - - plugins.push(scalprumPlugin); - - // These files are required by the transpiled code when using React Refresh. - // They need to be excluded to the module scope plugin which ensures that files - // that exist in the package are required. - const reactRefreshFiles = [ - require.resolve( - '@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js', - ), - require.resolve('@pmmmwh/react-refresh-webpack-plugin/overlay/index.js'), - require.resolve('react-refresh'), - ]; - - const withCache = yn(process.env[BUILD_CACHE_ENV_VAR], { default: false }); - - return { - cache: { - type: 'filesystem', - allowCollectingMemory: true, - cacheDirectory: joinPath(process.cwd(), '.webpack-cache'), - }, - mode: isDev ? 'development' : 'production', - profile: false, - optimization: optimization(options), - bail: false, - performance: { - hints: false, // we check the gzip size instead - }, - devtool: isDev ? 'eval-cheap-module-source-map' : 'source-map', - context: paths.targetPath, - entry: [...(options.additionalEntryPoints ?? []), paths.targetEntry], - resolve: { - alias: { - '@backstage/frontend-app-api/src': joinPath( - process.cwd(), - 'src', - 'overrides', - '@backstage', - 'frontend-app-api', - 'src', - ), - }, - extensions: ['.ts', '.tsx', '.mjs', '.js', '.jsx', '.json', '.wasm'], - mainFields: ['browser', 'module', 'main'], - fallback: { - ...pickBy(require('node-stdlib-browser')), - module: false, - dgram: false, - dns: false, - fs: false, - http2: false, - net: false, - tls: false, - child_process: false, - - /* new ignores */ - path: false, - https: false, - http: false, - util: require.resolve('util/'), - }, - plugins: [ - new LinkedPackageResolvePlugin(paths.rootNodeModules, externalPkgs), - new ModuleScopePlugin( - [paths.targetSrc, paths.targetDev], - [paths.targetPackageJson, ...reactRefreshFiles], - ), - ], - }, - module: { - rules: loaders, - }, - output: { - path: paths.targetDist, - publicPath: `${publicPath}/`, - filename: isDev ? '[name].js' : 'static/[name].[fullhash:8].js', - chunkFilename: isDev - ? '[name].chunk.js' - : 'static/[name].[chunkhash:8].chunk.js', - ...(isDev - ? { - devtoolModuleFilenameTemplate: (info: any) => - `file:///${resolvePath(info.absoluteResourcePath).replace( - /\\/g, - '/', - )}`, - } - : {}), - }, - plugins, - ...(withCache - ? { - cache: { - type: 'filesystem', - buildDependencies: { - config: [__filename], - }, - }, - } - : {}), - }; -} diff --git a/src/lib/bundler/index.ts b/src/lib/bundler/index.ts deleted file mode 100644 index 78c1d3f..0000000 --- a/src/lib/bundler/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export { buildBundle } from './bundle'; -export { serveBundle } from './server'; diff --git a/src/lib/bundler/optimization.ts b/src/lib/bundler/optimization.ts deleted file mode 100644 index fa99448..0000000 --- a/src/lib/bundler/optimization.ts +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { WebpackOptionsNormalized } from 'webpack'; - -import { BundlingOptions } from './types'; - -const { ESBuildMinifyPlugin } = require('esbuild-loader'); - -export const optimization = ( - options: BundlingOptions, -): WebpackOptionsNormalized['optimization'] => { - const { isDev } = options; - - return { - minimize: !isDev, - minimizer: [ - new ESBuildMinifyPlugin({ - target: 'es2019', - format: 'iife', - }), - ], - runtimeChunk: { name: _ => 'runtime' }, - splitChunks: { - automaticNameDelimiter: '-', - cacheGroups: { - default: false, - // Put all vendor code needed for initial page load in individual files if they're big - // enough, if they're smaller they end up in the main - packages: { - chunks: 'initial', - test(module: any) { - return Boolean( - module?.resource?.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/), - ); - }, - name(module: any) { - // get the name. E.g. node_modules/packageName/not/this/part.js - // or node_modules/packageName - const packageName = module.resource.match( - /[\\/]node_modules[\\/](.*?)([\\/]|$)/, - )[1]; - - // npm package names are URL-safe, but some servers don't like @ symbols - return packageName.replace('@', ''); - }, - filename: isDev - ? 'module-[name].js' - : 'static/module-[name].[chunkhash:8].js', - priority: 10, - minSize: 100000, - minChunks: 1, - maxAsyncRequests: Infinity, - maxInitialRequests: Infinity, - } as any, // filename is not included in type, but we need it - // Group together the smallest modules - vendor: { - chunks: 'initial', - test: /[\\/]node_modules[\\/]/, - name: 'vendor', - priority: 5, - enforce: true, - }, - }, - }, - }; -}; diff --git a/src/lib/bundler/packageDetection.ts b/src/lib/bundler/packageDetection.ts deleted file mode 100644 index 022cac4..0000000 --- a/src/lib/bundler/packageDetection.ts +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { BackstagePackageJson } from '@backstage/cli-node'; -import { Config } from '@backstage/config'; - -import chokidar from 'chokidar'; -import fs from 'fs-extra'; - -import { join as joinPath, resolve as resolvePath } from 'path'; - -import { paths as cliPaths } from '../paths'; - -const DETECTED_MODULES_MODULE_NAME = '__backstage-autodetected-plugins__'; - -interface PackageDetectionConfig { - include?: string[]; - exclude?: string[]; -} - -function readPackageDetectionConfig( - config: Config, -): PackageDetectionConfig | undefined { - const packages = config.getOptional('app.experimental.packages'); - if (packages === undefined || packages === null) { - return undefined; - } - - if (typeof packages === 'string') { - if (packages !== 'all') { - throw new Error( - `Invalid app.experimental.packages mode, got '${packages}', expected 'all'`, - ); - } - return {}; - } - - return { - include: config.getOptionalStringArray('app.experimental.packages.include'), - exclude: config.getOptionalStringArray('app.experimental.packages.exclude'), - }; -} - -/** - * This version of detectPackages differs from the implementation in - * @backstage/cli from 1.18.0 by omitting a block of code that includes the - * alpha entry point if available for frontend plugins. - */ -async function detectPackages( - targetPath: string, - { include, exclude }: PackageDetectionConfig, -) { - const pkg: BackstagePackageJson = await fs.readJson( - resolvePath(targetPath, 'package.json'), - ); - - return Object.keys(pkg.dependencies ?? {}) - .flatMap(depName => { - const depPackageJson: BackstagePackageJson = require( - require.resolve(`${depName}/package.json`, { paths: [targetPath] }), - ); - if ( - ['frontend-plugin', 'frontend-plugin-module'].includes( - depPackageJson.backstage?.role ?? '', - ) - ) { - // omitted block of code here - return [depName]; - } - return []; - }) - .filter(name => { - if (exclude?.includes(name)) { - return false; - } - if (include && !include.includes(name)) { - return false; - } - return true; - }); -} - -async function writeDetectedPackagesModule(packageNames: string[]) { - const requirePackageScript = packageNames - ?.map(pkg => `{ name: '${pkg}', default: require('${pkg}').default }`) - .join(','); - - await fs.writeFile( - joinPath( - cliPaths.targetRoot, - 'node_modules', - `${DETECTED_MODULES_MODULE_NAME}.js`, - ), - `window['__@backstage/discovered__'] = { modules: [${requirePackageScript}] };`, - ); -} - -export async function createDetectedModulesEntryPoint(options: { - config: Config; - targetPath: string; - watch?: () => void; -}): Promise { - const { config, watch, targetPath } = options; - - const detectionConfig = readPackageDetectionConfig(config); - if (!detectionConfig) { - return []; - } - - if (watch) { - const watcher = chokidar.watch(resolvePath(targetPath, 'package.json')); - - watcher.on('change', async () => { - await writeDetectedPackagesModule( - await detectPackages(targetPath, detectionConfig), - ); - watch(); - }); - } - - await writeDetectedPackagesModule( - await detectPackages(targetPath, detectionConfig), - ); - - return [DETECTED_MODULES_MODULE_NAME]; -} diff --git a/src/lib/bundler/paths.ts b/src/lib/bundler/paths.ts deleted file mode 100644 index abacb46..0000000 --- a/src/lib/bundler/paths.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import fs from 'fs-extra'; - -import { resolve as resolvePath } from 'path'; - -import { paths } from '../paths'; - -export type BundlingPathsOptions = { - // bundle entrypoint, e.g. 'src/index' - entry: string; - // Target directory, defaulting to paths.targetDir - targetDir?: string; -}; - -export function resolveBundlingPaths(options: BundlingPathsOptions) { - const { entry, targetDir = paths.targetDir } = options; - - const resolveTargetModule = (pathString: string) => { - for (const ext of ['mjs', 'js', 'ts', 'tsx', 'jsx']) { - const filePath = resolvePath(targetDir, `${pathString}.${ext}`); - if (fs.pathExistsSync(filePath)) { - return filePath; - } - } - return resolvePath(targetDir, `${pathString}.js`); - }; - - let targetPublic = undefined; - let targetHtml = resolvePath(targetDir, 'public/index.html'); - - // Prefer public folder - if (fs.pathExistsSync(targetHtml)) { - targetPublic = resolvePath(targetDir, 'public'); - } else { - targetHtml = resolvePath(targetDir, `${entry}.html`); - if (!fs.pathExistsSync(targetHtml)) { - targetHtml = paths.resolveOwn('templates/serve_index.html'); - } - } - - // Backend plugin dev run file - const targetRunFile = resolvePath(targetDir, 'src/run.ts'); - const runFileExists = fs.pathExistsSync(targetRunFile); - - return { - targetHtml, - targetPublic, - targetPath: resolvePath(targetDir, '.'), - targetRunFile: runFileExists ? targetRunFile : undefined, - targetDist: resolvePath(targetDir, 'dist'), - targetAssets: resolvePath(targetDir, 'assets'), - targetSrc: resolvePath(targetDir, 'src'), - targetDev: resolvePath(targetDir, 'dev'), - targetEntry: resolveTargetModule(entry), - targetTsConfig: paths.resolveTargetRoot('tsconfig.json'), - targetPackageJson: resolvePath(targetDir, 'package.json'), - rootNodeModules: paths.resolveTargetRoot('node_modules'), - root: paths.targetRoot, - }; -} - -export type BundlingPaths = ReturnType; diff --git a/src/lib/bundler/scalprumConfig.ts b/src/lib/bundler/scalprumConfig.ts deleted file mode 100644 index 66aba79..0000000 --- a/src/lib/bundler/scalprumConfig.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { DynamicRemotePlugin } from '@openshift/dynamic-plugin-sdk-webpack'; -import ESLintPlugin from 'eslint-webpack-plugin'; -import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'; -import pickBy from 'lodash/pickBy'; -import webpack, { ProvidePlugin } from 'webpack'; - -import { join as joinPath, resolve as resolvePath } from 'path'; - -import { BundlingPaths } from './paths'; -import { transforms } from './transforms'; -import { DynamicPluginOptions } from './types'; - -/** - * TODO: Create a config API to configure and optimize dependency sharing - * https://medium.com/@marvusm.mmi/webpack-module-federation-think-twice-before-sharing-a-dependency-18b3b0e352cb - */ -export const sharedModules = { - /** - * Mandatory singleton packages for sharing - */ - react: { - singleton: true, - requiredVersion: '*', - }, - 'react-dom': { - singleton: true, - requiredVersion: '*', - }, - 'react-router-dom': { - singleton: true, - requiredVersion: '*', - }, - 'react-router': { - singleton: true, - requiredVersion: '*', - }, - '@backstage/version-bridge': { - singleton: true, - requiredVersion: '*', - }, - '@backstage/core-app-api': { - singleton: true, - requiredVersion: '*', - }, - '@backstage/core-plugin-api': { - singleton: true, - requiredVersion: '*', - }, - '@backstage/frontend-plugin-api': { - singleton: true, - requiredVersion: '*', - }, - '@scalprum/react-core': { - singleton: true, - requiredVersion: '*', - }, - '@openshift/dynamic-plugin-sdk': { - singleton: true, - requiredVersion: '*', - }, - /** - * The following two packages are required to be shared as singletons to enable UI theming - */ - '@material-ui/core/styles': { - singleton: true, - requiredVersion: '*', - }, - '@material-ui/styles': { - singleton: true, - requiredVersion: '*', - }, - '@mui/material': { - singleton: true, - requiredVersion: '*', - }, - '@mui/system': { - singleton: true, - requiredVersion: '*', - }, - '@mui/private-theming': { - singleton: true, - requiredVersion: '*', - }, - '@mui/styled-engine': { - singleton: true, - requiredVersion: '*', - }, - '@emotion/cache': { - singleton: true, - requiredVersion: '*', - }, - '@emotion/react': { - singleton: true, - requiredVersion: '*', - }, -}; - -export async function createScalprumConfig( - paths: BundlingPaths & { targetScalprumDist: string }, - options: DynamicPluginOptions, -): Promise { - const { checksEnabled, isDev } = options; - - const { plugins, loaders } = transforms({ - ...options, - isDev: !!options.isDev, - }); - - if (checksEnabled) { - plugins.push( - new ForkTsCheckerWebpackPlugin({ - typescript: { configFile: paths.targetTsConfig, memoryLimit: 4096 }, - }), - new ESLintPlugin({ - context: paths.targetPath, - files: ['**/*.(ts|tsx|mts|cts|js|jsx|mjs|cjs)'], - }), - ); - } - - // TODO(blam): process is no longer auto polyfilled by webpack in v5. - // we use the provide plugin to provide this polyfill, but lets look - // to remove this eventually! - plugins.push( - new ProvidePlugin({ - process: 'process/browser', - Buffer: ['buffer', 'Buffer'], - }), - ); - - plugins.push( - new webpack.EnvironmentPlugin({ - HAS_REACT_DOM_CLIENT: false, - }), - ); - - const dynamicPluginPlugin = new DynamicRemotePlugin({ - extensions: [], - sharedModules, - entryScriptFilename: `${options.pluginMetadata.name}.[fullhash].js`, - pluginMetadata: { - ...options.pluginMetadata, - }, - }); - plugins.push(dynamicPluginPlugin); - - return { - mode: isDev ? 'development' : 'production', - profile: false, - bail: false, - performance: { - hints: false, // we check the gzip size instead - }, - devtool: isDev ? 'eval-cheap-module-source-map' : 'source-map', - context: paths.targetPath, - entry: {}, // Plugin container entry is generated by DynamicRemotePlugin - resolve: { - alias: { - '@backstage/frontend-app-api/src': joinPath( - process.cwd(), - 'src', - 'overrides', - '@backstage', - 'frontend-app-api', - 'src', - ), - }, - extensions: ['.ts', '.tsx', '.mjs', '.js', '.jsx', '.json', '.wasm'], - fallback: { - ...pickBy(require('node-stdlib-browser')), - module: false, - dgram: false, - dns: false, - fs: false, - http2: false, - net: false, - tls: false, - child_process: false, - - /* new ignores */ - path: false, - https: false, - http: false, - util: require.resolve('util/'), - }, - }, - module: { - rules: loaders, - }, - output: { - path: paths.targetScalprumDist, - publicPath: 'auto', - filename: isDev ? '[name].js' : 'static/[name].[fullhash:8].js', - chunkFilename: isDev - ? '[name].chunk.js' - : 'static/[name].[chunkhash:8].chunk.js', - ...(isDev - ? { - devtoolModuleFilenameTemplate: (info: any) => - `file:///${resolvePath(info.absoluteResourcePath).replace( - /\\/g, - '/', - )}`, - } - : {}), - }, - plugins, - }; -} diff --git a/src/lib/bundler/server.ts b/src/lib/bundler/server.ts deleted file mode 100644 index 576cb3e..0000000 --- a/src/lib/bundler/server.ts +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import openBrowser from 'react-dev-utils/openBrowser'; - -import { PackageGraph } from '@backstage/cli-node'; -import { AppConfig } from '@backstage/config'; - -import chalk from 'chalk'; -import fs from 'fs-extra'; -import uniq from 'lodash/uniq'; -import webpack from 'webpack'; -import WebpackDevServer from 'webpack-dev-server'; - -import { - forbiddenDuplicatesFilter, - includedFilter, -} from '../../commands/versions/lint'; -import { paths as libPaths } from '../../lib/paths'; -import { loadCliConfig } from '../config'; -import { Lockfile } from '../versioning'; -import { createConfig, resolveBaseUrl } from './config'; -import { createDetectedModulesEntryPoint } from './packageDetection'; -import { resolveBundlingPaths } from './paths'; -import { ServeOptions } from './types'; - -export async function serveBundle(options: ServeOptions) { - const paths = resolveBundlingPaths(options); - const targetPkg = await fs.readJson(paths.targetPackageJson); - - if (options.verifyVersions) { - const lockfile = await Lockfile.load( - libPaths.resolveTargetRoot('yarn.lock'), - ); - const result = lockfile.analyze({ - filter: includedFilter, - localPackages: PackageGraph.fromPackages( - await PackageGraph.listTargetPackages(), - ), - }); - const problemPackages = [...result.newVersions, ...result.newRanges] - .map(({ name }) => name) - .filter(forbiddenDuplicatesFilter); - - if (problemPackages.length > 1) { - console.log( - chalk.yellow( - `⚠️ Some of the following packages may be outdated or have duplicate installations: - - ${uniq(problemPackages).join(', ')} - `, - ), - ); - console.log( - chalk.yellow( - `⚠️ This can be resolved using the following command: - - yarn backstage-cli versions:check --fix - `, - ), - ); - } - } - - checkReactVersion(); - - const { name } = await fs.readJson(libPaths.resolveTarget('package.json')); - - let server: WebpackDevServer | undefined = undefined; - let latestFrontendAppConfigs: AppConfig[] = []; - - const cliConfig = await loadCliConfig({ - args: options.configPaths, - fromPackage: name, - withFilteredKeys: true, - watch(appConfigs) { - latestFrontendAppConfigs = appConfigs; - server?.invalidate(); - }, - }); - latestFrontendAppConfigs = cliConfig.frontendAppConfigs; - - const appBaseUrl = cliConfig.frontendConfig.getString('app.baseUrl'); - const backendBaseUrl = cliConfig.frontendConfig.getString('backend.baseUrl'); - if (appBaseUrl === backendBaseUrl) { - console.log( - chalk.yellow( - `⚠️ Conflict between app baseUrl and backend baseUrl: - - app.baseUrl: ${appBaseUrl} - backend.baseUrl: ${backendBaseUrl} - - Must have unique hostname and/or ports. - - This can be resolved by changing app.baseUrl and backend.baseUrl to point to their respective local development ports. -`, - ), - ); - } - - const { frontendConfig, fullConfig } = cliConfig; - const url = resolveBaseUrl(frontendConfig); - - const host = - frontendConfig.getOptionalString('app.listen.host') || url.hostname; - const port = - frontendConfig.getOptionalNumber('app.listen.port') || - Number(url.port) || - (url.protocol === 'https:' ? 443 : 80); - - const detectedModulesEntryPoint = await createDetectedModulesEntryPoint({ - config: fullConfig, - targetPath: paths.targetPath, - watch() { - server?.invalidate(); - }, - }); - - const config = await createConfig(paths, { - ...options, - checksEnabled: options.checksEnabled, - isDev: true, - baseUrl: url, - frontendConfig, - getFrontendAppConfigs: () => { - return latestFrontendAppConfigs; - }, - additionalEntryPoints: detectedModulesEntryPoint, - }); - - const compiler = webpack(config); - - server = new WebpackDevServer( - { - hot: !process.env.CI, - devMiddleware: { - publicPath: config.output?.publicPath as string, - stats: 'errors-warnings', - }, - static: paths.targetPublic - ? { - publicPath: config.output?.publicPath as string, - directory: paths.targetPublic, - } - : undefined, - historyApiFallback: { - // Paths with dots should still use the history fallback. - // See https://github.com/facebookincubator/create-react-app/issues/387. - disableDotRule: true, - - // The index needs to be rewritten relative to the new public path, including subroutes. - index: `${config.output?.publicPath}index.html`, - }, - https: - url.protocol === 'https:' - ? { - cert: fullConfig.getString('app.https.certificate.cert'), - key: fullConfig.getString('app.https.certificate.key'), - } - : false, - host, - port, - proxy: targetPkg.proxy, - // When the dev server is behind a proxy, the host and public hostname differ - allowedHosts: [url.hostname], - client: { - webSocketURL: 'auto://0.0.0.0:0/ws', - }, - } as any, - compiler as any, - ); - - await new Promise((resolve, reject) => { - server?.startCallback((err?: Error) => { - if (err) { - reject(err); - return; - } - - openBrowser(url.href); - resolve(); - }); - }); - - const waitForExit = async () => { - for (const signal of ['SIGINT', 'SIGTERM'] as const) { - process.on(signal, () => { - server?.stop(); - // exit instead of resolve. The process is shutting down and resolving a promise here logs an error - process.exit(); - }); - } - - // Block indefinitely and wait for the interrupt signal - return new Promise(() => {}); - }; - - return waitForExit; -} - -function checkReactVersion() { - try { - // Make sure we're looking at the root of the target repo - const reactPkgPath = require.resolve('react/package.json', { - paths: [libPaths.targetRoot], - }); - const reactPkg = require(reactPkgPath); - if (reactPkg.version.startsWith('16.')) { - console.log( - chalk.yellow( - ` -⚠️ ⚠️ -⚠️ You are using React version 16, which is deprecated for use in Backstage. ⚠️ -⚠️ Please upgrade to React 17 by updating your packages/app dependencies. ⚠️ -⚠️ ⚠️ -`, - ), - ); - } - } catch { - /* ignored */ - } -} diff --git a/src/lib/bundler/transforms.ts b/src/lib/bundler/transforms.ts deleted file mode 100644 index 147829a..0000000 --- a/src/lib/bundler/transforms.ts +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import ReactRefreshPlugin from '@pmmmwh/react-refresh-webpack-plugin'; -import MiniCssExtractPlugin from 'mini-css-extract-plugin'; -import { ModuleOptions, WebpackPluginInstance } from 'webpack'; - -import { svgrTemplate } from '../svgrTemplate'; - -type Transforms = { - loaders: ModuleOptions['rules']; - plugins: WebpackPluginInstance[]; -}; - -type TransformOptions = { - isDev: boolean; - isBackend?: boolean; -}; - -export const transforms = (options: TransformOptions): Transforms => { - const { isDev, isBackend } = options; - - // This ensures that styles inserted from the style-loader and any - // async style chunks are always given lower priority than JSS styles. - // Note that this function is stringified and executed in the browser - // after transpilation, so stick to simple syntax - function insertBeforeJssStyles(element: any) { - const head = document.head; - // This makes sure that any style elements we insert get put before the - // dynamic styles from JSS, such as the ones from `makeStyles()`. - // TODO(Rugvip): This will likely break in material-ui v5, keep an eye on it. - const firstJssNode = head.querySelector('style[data-jss]'); - if (!firstJssNode) { - head.appendChild(element); - } else { - head.insertBefore(element, firstJssNode); - } - } - - const loaders = [ - { - test: /\.(tsx?)$/, - exclude: /node_modules/, - use: [ - { - loader: require.resolve('swc-loader'), - options: { - jsc: { - target: 'es2019', - externalHelpers: !isBackend, - parser: { - syntax: 'typescript', - tsx: !isBackend, - dynamicImport: true, - }, - transform: { - react: isBackend - ? undefined - : { - runtime: 'automatic', - refresh: isDev, - }, - }, - }, - }, - }, - ], - }, - { - test: /\.(jsx?|mjs|cjs)$/, - exclude: /node_modules/, - use: [ - { - loader: require.resolve('swc-loader'), - options: { - jsc: { - target: 'es2019', - externalHelpers: !isBackend, - parser: { - syntax: 'ecmascript', - jsx: !isBackend, - dynamicImport: true, - }, - transform: { - react: isBackend - ? undefined - : { - runtime: 'automatic', - refresh: isDev, - }, - }, - }, - }, - }, - ], - }, - { - test: /\.(js|mjs|cjs)$/, - resolve: { - fullySpecified: false, - }, - }, - { - test: [/\.icon\.svg$/], - use: [ - { - loader: require.resolve('swc-loader'), - options: { - jsc: { - target: 'es2019', - externalHelpers: !isBackend, - parser: { - syntax: 'ecmascript', - jsx: !isBackend, - dynamicImport: true, - }, - }, - }, - }, - { - loader: require.resolve('@svgr/webpack'), - options: { babel: false, template: svgrTemplate }, - }, - ], - }, - { - test: [ - /\.bmp$/, - /\.gif$/, - /\.jpe?g$/, - /\.png$/, - /\.frag$/, - /\.vert$/, - { and: [/\.svg$/, { not: [/\.icon\.svg$/] }] }, - /\.xml$/, - ], - type: 'asset/resource', - generator: { - filename: 'static/[name].[hash:8].[ext]', - }, - }, - { - test: /\.(eot|woff|woff2|ttf)$/i, - type: 'asset/resource', - generator: { - filename: 'static/[name].[hash][ext][query]', - }, - }, - { - test: /\.ya?ml$/, - use: require.resolve('yml-loader'), - }, - { - include: /\.(md)$/, - type: 'asset/resource', - generator: { - filename: 'static/[name].[hash][ext][query]', - }, - }, - { - test: /\.css$/i, - use: [ - isDev - ? { - loader: require.resolve('style-loader'), - options: { - insert: insertBeforeJssStyles, - }, - } - : MiniCssExtractPlugin.loader, - { - loader: require.resolve('css-loader'), - options: { - sourceMap: true, - }, - }, - ], - }, - ]; - - const plugins = new Array(); - - if (isDev) { - if (!isBackend) { - plugins.push(new ReactRefreshPlugin()); - } - } else { - plugins.push( - new MiniCssExtractPlugin({ - filename: 'static/[name].[contenthash:8].css', - chunkFilename: 'static/[name].[id].[contenthash:8].css', - insert: insertBeforeJssStyles, // Only applies to async chunks - }), - ); - } - - return { loaders, plugins }; -}; diff --git a/src/lib/bundler/types.ts b/src/lib/bundler/types.ts deleted file mode 100644 index 9984eee..0000000 --- a/src/lib/bundler/types.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { AppConfig, Config } from '@backstage/config'; -import { ConfigSchema } from '@backstage/config-loader'; - -import { PluginBuildMetadata } from '@openshift/dynamic-plugin-sdk-webpack'; - -import { BundlingPathsOptions } from './paths'; - -export type BundlingOptions = { - checksEnabled: boolean; - isDev: boolean; - frontendConfig: Config; - getFrontendAppConfigs(): AppConfig[]; - baseUrl: URL; - parallelism?: number; - additionalEntryPoints?: string[]; -}; - -/** - * This type is added to support dynamic plugins - */ -export type DynamicPluginOptions = { - checksEnabled?: boolean; - isDev?: boolean; - parallelism?: number; - pluginMetadata: PluginBuildMetadata; -}; - -export type ServeOptions = BundlingPathsOptions & { - checksEnabled: boolean; - configPaths: string[]; - verifyVersions?: boolean; -}; - -/** - * This version of BuildOptions adds the pluginMetadata field as compared to - * the type defined in @backstage/cli from 1.18.0 - */ -export type BuildOptions = BundlingPathsOptions & { - // Target directory, defaulting to paths.targetDir - targetDir?: string; - statsJsonEnabled: boolean; - parallelism?: number; - schema?: ConfigSchema; - frontendConfig: Config; - frontendAppConfigs: AppConfig[]; - fullConfig: Config; - pluginMetadata?: PluginBuildMetadata; -}; diff --git a/src/lib/config.ts b/src/lib/config.ts deleted file mode 100644 index 7720e5f..0000000 --- a/src/lib/config.ts +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { PackageGraph } from '@backstage/cli-node'; -import { AppConfig, ConfigReader } from '@backstage/config'; -import { - ConfigTarget, - loadConfig, - loadConfigSchema, -} from '@backstage/config-loader'; - -import { getPackages } from '@manypkg/get-packages'; - -import { paths } from './paths'; -import { isValidUrl } from './urls'; - -type Options = { - args: string[]; - fromPackage?: string; - mockEnv?: boolean; - withFilteredKeys?: boolean; - withDeprecatedKeys?: boolean; - fullVisibility?: boolean; - strict?: boolean; - watch?: (newFrontendAppConfigs: AppConfig[]) => void; -}; - -/** - * This version of loadCliConfig only differs from the implementation used in - * @backstage/cli from 1.18.0 by the package name check for the CLI package, - * indicated by a comment below - */ -export async function loadCliConfig(options: Options) { - const configTargets: ConfigTarget[] = []; - options.args.forEach(arg => { - if (!isValidUrl(arg)) { - configTargets.push({ path: paths.resolveTarget(arg) }); - } - }); - - // Consider all packages in the monorepo when loading in config - const { packages } = await getPackages(paths.targetDir); - - let localPackageNames; - if (options.fromPackage) { - if (packages.length) { - const graph = PackageGraph.fromPackages(packages); - localPackageNames = Array.from( - graph.collectPackageNames([options.fromPackage], node => { - // Workaround for Backstage main repo only, since the CLI has some artificial devDependencies - // this is the only difference from @backstage/cli - if (node.name === '@janus-idp/cli') { - return undefined; - } - return node.localDependencies.keys(); - }), - ); - } else { - // No packages: it means that it's not a monorepo (e.g. standalone plugin) - localPackageNames = [options.fromPackage]; - } - } else { - localPackageNames = packages.map(p => p.packageJson.name); - } - - const schema = await loadConfigSchema({ - dependencies: localPackageNames, - // Include the package.json in the project root if it exists - packagePaths: [paths.resolveTargetRoot('package.json')], - noUndeclaredProperties: options.strict, - }); - - const { appConfigs } = await loadConfig({ - experimentalEnvFunc: options.mockEnv - ? async name => process.env[name] || 'x' - : undefined, - configRoot: paths.targetRoot, - configTargets: configTargets, - watch: options.watch && { - onChange(newAppConfigs) { - const newFrontendAppConfigs = schema.process(newAppConfigs, { - visibility: options.fullVisibility - ? ['frontend', 'backend', 'secret'] - : ['frontend'], - withFilteredKeys: options.withFilteredKeys, - withDeprecatedKeys: options.withDeprecatedKeys, - ignoreSchemaErrors: !options.strict, - }); - options.watch?.(newFrontendAppConfigs); - }, - }, - }); - - // printing to stderr to not clobber stdout in case the cli command - // outputs structured data (e.g. as config:schema does) - process.stderr.write( - `Loaded config from ${appConfigs.map(c => c.context).join(', ')}\n`, - ); - - try { - const frontendAppConfigs = schema.process(appConfigs, { - visibility: options.fullVisibility - ? ['frontend', 'backend', 'secret'] - : ['frontend'], - withFilteredKeys: options.withFilteredKeys, - withDeprecatedKeys: options.withDeprecatedKeys, - ignoreSchemaErrors: !options.strict, - }); - const frontendConfig = ConfigReader.fromConfigs(frontendAppConfigs); - - const fullConfig = ConfigReader.fromConfigs(appConfigs); - - return { - schema, - appConfigs, - frontendConfig, - frontendAppConfigs, - fullConfig, - }; - } catch (error) { - const maybeSchemaError = error as Error & { messages?: string[] }; - if (maybeSchemaError.messages) { - const messages = maybeSchemaError.messages.join('\n '); - throw new Error(`Configuration does not match schema\n\n ${messages}`); - } - throw error; - } -} diff --git a/src/lib/role.test.ts b/src/lib/role.test.ts deleted file mode 100644 index 484fa51..0000000 --- a/src/lib/role.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2022 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Command } from 'commander'; -import mockFs from 'mock-fs'; - -import { findRoleFromCommand } from './role'; - -describe('findRoleFromCommand', () => { - function mkCommand(args: string) { - const parsed = new Command() - .option('--role ', 'test role') - .parse(['node', 'entry.js', ...args.split(' ')]) as Command; - return parsed.opts(); - } - - beforeEach(() => { - mockFs({ - 'package.json': JSON.stringify({ - name: 'test', - backstage: { - role: 'web-library', - }, - }), - }); - }); - - afterEach(() => { - mockFs.restore(); - }); - - it('provides role info by role', async () => { - await expect(findRoleFromCommand(mkCommand(''))).resolves.toEqual( - 'web-library', - ); - - await expect( - findRoleFromCommand(mkCommand('--role node-library')), - ).resolves.toEqual('node-library'); - - await expect( - findRoleFromCommand(mkCommand('--role invalid')), - ).rejects.toThrow(`Unknown package role 'invalid'`); - }); -}); diff --git a/src/lib/role.ts b/src/lib/role.ts deleted file mode 100644 index bab335f..0000000 --- a/src/lib/role.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2023 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { PackageRole, PackageRoles } from '@backstage/cli-node'; - -import { OptionValues } from 'commander'; -import fs from 'fs-extra'; - -import { paths } from './paths'; - -export async function findRoleFromCommand( - opts: OptionValues, -): Promise { - if (opts.role) { - return PackageRoles.getRoleInfo(opts.role)?.role; - } - - const pkg = await fs.readJson(paths.resolveTarget('package.json')); - const info = PackageRoles.getRoleFromPackage(pkg); - if (!info) { - throw new Error(`Target package must have 'backstage.role' set`); - } - return info; -} diff --git a/src/lib/svgrTemplate.ts b/src/lib/svgrTemplate.ts deleted file mode 100644 index b583004..0000000 --- a/src/lib/svgrTemplate.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * This template, together with loaders in the bundler and packages, allows - * for SVG to be imported directly as Material UI SvgIcon components by suffixing - * them with .icon.svg - */ -export function svgrTemplate( - { imports, interfaces, componentName, props, jsx }: any, - { tpl }: any, -) { - const name = `${componentName.replace(/icon$/, '')}Icon`; - - const defaultExport = { - type: 'ExportDefaultDeclaration', - declaration: { type: 'Identifier', name }, - }; - - return tpl` -${imports} -import SvgIcon from '@material-ui/core/SvgIcon'; - -${interfaces} - -const ${name} = (${props}) => React.createElement(SvgIcon, ${props}, ${jsx.children}); - -${defaultExport}`; -} diff --git a/src/lib/urls.test.ts b/src/lib/urls.test.ts deleted file mode 100644 index c2a67fb..0000000 --- a/src/lib/urls.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { isValidUrl } from './urls'; - -describe('isValidUrl', () => { - it('should return true for url', () => { - const validUrl = isValidUrl('http://some.valid.url'); - expect(validUrl).toBe(true); - }); - - it('should return false for absolute path', () => { - const validUrl = isValidUrl('/some/absolute/path'); - expect(validUrl).toBe(false); - }); - - it('should return false for relative path', () => { - const validUrl = isValidUrl('../some/relative/path'); - expect(validUrl).toBe(false); - }); -}); diff --git a/src/lib/urls.ts b/src/lib/urls.ts deleted file mode 100644 index 848cea2..0000000 --- a/src/lib/urls.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export function isValidUrl(url: string): boolean { - try { - // eslint-disable-next-line no-new - new URL(url); - return true; - } catch { - return false; - } -} diff --git a/src/types.d.ts b/src/types.d.ts deleted file mode 100644 index cbc95ab..0000000 --- a/src/types.d.ts +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -declare namespace NodeJS { - interface ProcessEnv { - readonly NODE_ENV: 'development' | 'production' | 'test'; - } -} -declare module 'fs' { - export interface StatSyncFn {} -} - -declare module 'gitconfiglocal'; - -declare module 'react-dev-utils/formatWebpackMessages' { - export default function (stats: any): { - errors: string[]; - warnings: string[]; - }; -} - -declare module 'react-dev-utils/openBrowser' { - export default function (url: string): boolean; -} - -declare module 'react-dev-utils/ModuleScopePlugin' { - import webpack = require('webpack'); - - export default class ModuleScopePlugin - implements webpack.WebpackPluginInstance - { - constructor( - appSrc: string | ReadonlyArray, - allowedFiles?: ReadonlyArray, - ); - apply: (resolver: any) => void; - } -} - -declare module 'react-dev-utils/FileSizeReporter' { - import webpack = require('webpack'); - - export interface OpaqueFileSizes { - root: string; - sizes: Record; - } - - /** - * Captures JS and CSS asset sizes inside the passed `buildFolder`. Save the - * result value to compare it after the build. - */ - export function measureFileSizesBeforeBuild( - buildFolder: string, - ): Promise; - - /** - * Prints the JS and CSS asset sizes after the build, and includes a size - * comparison with `previousFileSizes` that were captured earlier using - * `measureFileSizesBeforeBuild()`. `maxBundleGzipSize` and - * `maxChunkGzipSizemay` may optionally be specified to display a warning when - * the main bundle or a chunk exceeds the specified size (in bytes). - */ - export function printFileSizesAfterBuild( - webpackStats: webpack.Stats, - previousFileSizes: OpaqueFileSizes, - buildFolder: string, - maxBundleGzipSize?: number, - maxChunkGzipSize?: number, - ): void; -} - -declare module 'mini-css-extract-plugin' { - import webpack = require('webpack'); - - /** - * Lightweight CSS extraction webpack plugin. - * - * This plugin extracts CSS into separate files. It creates a CSS file per JS file which - * contains CSS. It supports On-Demand-Loading of CSS and SourceMaps. - * - * Configuration Detail: https://github.com/webpack-contrib/mini-css-extract-plugin#configuration - */ - export default class MiniCssExtractPlugin { - /** - * Webpack loader always used at the end of loaders list (ie. array index zero). - */ - static loader: string; - - constructor(options?: MiniCssExtractPlugin.PluginOptions); - - /** - * Apply the plugin - */ - apply(compiler: webpack.Compiler): void; - } - - namespace MiniCssExtractPlugin { - interface PluginOptions { - /** - * Works like [`output.filename`](https://webpack.js.org/configuration/output/#outputfilename). - */ - filename?: Required['output']['filename']; - /** - * Works like [`output.chunkFilename`](https://webpack.js.org/configuration/output/#outputchunkfilename). - */ - chunkFilename?: string; - /** - * For projects where CSS ordering has been mitigated through consistent - * use of scoping or naming conventions, the CSS order warnings can be - * disabled by setting this flag to true for the plugin. - */ - ignoreOrder?: boolean; - /** - * Specify where to insert the link tag. - * - * A string value specifies a DOM query for a parent element to attach to. - * - * A function allows to override default behavior for non-entry CSS chunks. - * This code will run in the browser alongside your application. It is recommend - * to only use ECMA 5 features and syntax. The function won't have access to the - * scope of the webpack configuration module. - * - * @default function() { document.head.appendChild(linkTag); } - */ - insert?: string | ((linkTag: any) => void); - /** - * Specify additional html attributes to add to the link tag. - * - * Note: These are only applied to dynamically loaded css chunks. To modify link - * attributes for entry CSS chunks, please use html-webpack-plugin. - */ - attributes?: Record; - /** - * This option allows loading asynchronous chunks with a custom link type, such as - * ``. - * - * `false` disables the link `type` attribute. - * - * @default 'text/css' - */ - linkType?: string | false | 'text/css'; - } - interface LoaderOptions { - /** - * Overrides [`output.publicPath`](https://webpack.js.org/configuration/output/#outputpublicpath). - * @default output.publicPath - */ - publicPath?: string | ((resourcePath: string, context: string) => string); - /** - * If false, the plugin will extract the CSS but **will not** emit the file - * @default true - */ - emit?: boolean; - /** - * By default, `mini-css-extract-plugin` generates JS modules that use the ES modules syntax. - * There are some cases in which using ES modules is beneficial, - * like in the case of module concatenation and tree shaking. - * @default true - */ - esModule?: boolean; - modules?: { - /** - * Enables/disables ES modules named export for locals. - * - * Names of locals are converted to camelCase. It is not allowed to use - * JavaScript reserved words in CSS class names. Options `esModule` and - * `modules.namedExport` in css-loader and MiniCssExtractPlugin.loader - * must be enabled. - * - * @default false - */ - namedExport?: boolean; - }; - } - } -} - -declare module 'fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPlugin' {} -declare module 'webpack-node-externals' { - export default function webpackNodeExternals( - options?: webpackNodeExternals.Options, - ): any; - - namespace webpackNodeExternals { - type AllowlistOption = string | RegExp | AllowlistFunctionType; - type ImportTypeCallback = (moduleName: string) => string; - /** a function that accepts the module name and returns whether it should be included */ - type AllowlistFunctionType = (moduleName: string) => boolean; - interface ModulesFromFileType { - exclude?: string | string[]; - include?: string | string[]; - } - - interface Options { - /** - * An array for the externals to allow, so they will be included in the bundle. - * Can accept exact strings ('module_name'), regex patterns (/^module_name/), or a - * function that accepts the module name and returns whether it should be included. - * Important - if you have set aliases in your webpack config with the exact - * same names as modules in node_modules, you need to allowlist them so Webpack will know - * they should be bundled. - * @default [] - */ - allowlist?: AllowlistOption[] | AllowlistOption; - /** - * @default ['.bin'] - */ - binaryDirs?: string[]; - /** - * The method in which unbundled modules will be required in the code. Best to leave as - * 'commonjs' for node modules. - * @default 'commonjs' - */ - importType?: - | 'var' - | 'this' - | 'commonjs' - | 'amd' - | 'umd' - | ImportTypeCallback; - /** - * The folder in which to search for the node modules. - * @default 'node_modules' - */ - modulesDir?: string; - /** - * Additional folders to look for node modules. - */ - additionalModuleDirs?: string[]; - /** - * Read the modules from the package.json file instead of the node_modules folder. - * @default false - */ - modulesFromFile?: boolean | ModulesFromFileType; - /** - * @default false - */ - includeAbsolutePaths?: boolean; - } - } -} - -declare module '@esbuild-kit/cjs-loader' {} - -// Backstage CLI types are now auto-generated in src/generated/backstage-cli-types.d.ts -// Run 'npm run generate-types' to regenerate them based on the package.json version diff --git a/yarn.lock b/yarn.lock index 399e517..2a949ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -99,14 +99,14 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.27.2, @babel/compat-data@npm:^7.29.7": +"@babel/compat-data@npm:^7.29.7": version: 7.29.7 resolution: "@babel/compat-data@npm:7.29.7" checksum: 10/ad2272714087f68970977f6e2b53597a8503fc9c3028c4a91686474bd77a707dd00903cdde4b73788972016d1bad4dc3fa4e5ff38e1ed8f1c3bde1095352973a languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.19.6, @babel/core@npm:^7.23.9, @babel/core@npm:^7.27.4": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.27.4": version: 7.29.7 resolution: "@babel/core@npm:7.29.7" dependencies: @@ -142,16 +142,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-annotate-as-pure@npm:7.27.1" - dependencies: - "@babel/types": "npm:^7.27.1" - checksum: 10/3f8e4d591458d6c0621a3d670f8798b8895580214287390126e3e621ddf3df0bd07cbcc9500c2671b9ec10162c2f9feb1194da5cf039d40df8cb69d181fc0cd8 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2, @babel/helper-compilation-targets@npm:^7.29.7": +"@babel/helper-compilation-targets@npm:^7.29.7": version: 7.29.7 resolution: "@babel/helper-compilation-targets@npm:7.29.7" dependencies: @@ -164,51 +155,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-create-class-features-plugin@npm:7.27.1" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-member-expression-to-functions": "npm:^7.27.1" - "@babel/helper-optimise-call-expression": "npm:^7.27.1" - "@babel/helper-replace-supers": "npm:^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/701579b49046cd42f6a6b1e693e6827df8623185adf0911c4d68a219a082d8fd4501672880d92b6b96263d1c92a3beb891b3464a662a55e69e7539d8db9277da - languageName: node - linkType: hard - -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.27.1" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - regexpu-core: "npm:^6.2.0" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/dea272628cd8874f127ab7b2ee468620aabc1383d38bb40c49a9c7667db2258cdfe6620a1d1412f5f0706583f6301b4b7ad3d5932f24df7fe72e66bf9bc0be45 - languageName: node - linkType: hard - -"@babel/helper-define-polyfill-provider@npm:^0.6.3, @babel/helper-define-polyfill-provider@npm:^0.6.4": - version: 0.6.4 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.4" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" - debug: "npm:^4.1.1" - lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.14.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/dc2ebdd7bc880fff8cd09a5b0bd208e53d8b7ea9070f4b562dd3135ea6cd68ef80cf4a74f40424569a00c00eabbcdff67b2137a874c4f82f3530246dad267a3b - languageName: node - linkType: hard - "@babel/helper-globals@npm:^7.29.7": version: 7.29.7 resolution: "@babel/helper-globals@npm:7.29.7" @@ -216,1227 +162,285 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-member-expression-to-functions@npm:7.27.1" - dependencies: - "@babel/traverse": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" - checksum: 10/533a5a2cf1c9a8770d241b86d5f124c88e953c831a359faf1ac7ba1e632749c1748281b83295d227fe6035b202d81f3d3a1ea13891f150c6538e040668d6126a - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.27.1, @babel/helper-module-imports@npm:^7.29.7": +"@babel/helper-module-imports@npm:^7.29.7": version: 7.29.7 resolution: "@babel/helper-module-imports@npm:7.29.7" dependencies: "@babel/traverse": "npm:^7.29.7" - "@babel/types": "npm:^7.29.7" - checksum: 10/28ec6f7efd99588d6eebfb25c9f1ccc34cb0cdb0839c4c0f08b3ec0105ccaefbe7e8b4f651f3f55a4f5c4fcb1d979bd32a9b8ee23e3e62163ea22aaa7ee0dfa1 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.6, @babel/helper-module-transforms@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helper-module-transforms@npm:7.29.7" - dependencies: - "@babel/helper-module-imports": "npm:^7.29.7" - "@babel/helper-validator-identifier": "npm:^7.29.7" - "@babel/traverse": "npm:^7.29.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/33251b1fb44d726194a974a0078b1269511d130a2609357ff829b479e9e4dca96ecd5384c534a477095f665ffb01503d3e680699c2002e5b62e6ca1a272f1892 - languageName: node - linkType: hard - -"@babel/helper-optimise-call-expression@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-optimise-call-expression@npm:7.27.1" - dependencies: - "@babel/types": "npm:^7.27.1" - checksum: 10/0fb7ee824a384529d6b74f8a58279f9b56bfe3cce332168067dddeab2552d8eeb56dc8eaf86c04a3a09166a316cb92dfc79c4c623cd034ad4c563952c98b464f - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.28.6, @babel/helper-plugin-utils@npm:^7.8.0": - version: 7.28.6 - resolution: "@babel/helper-plugin-utils@npm:7.28.6" - checksum: 10/21c853bbc13dbdddf03309c9a0477270124ad48989e1ad6524b83e83a77524b333f92edd2caae645c5a7ecf264ec6d04a9ebe15aeb54c7f33c037b71ec521e4a - languageName: node - linkType: hard - -"@babel/helper-remap-async-to-generator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-remap-async-to-generator@npm:7.27.1" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-wrap-function": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/0747397ba013f87dbf575454a76c18210d61c7c9af0f697546b4bcac670b54ddc156330234407b397f0c948738c304c228e0223039bc45eab4fbf46966a5e8cc - languageName: node - linkType: hard - -"@babel/helper-replace-supers@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-replace-supers@npm:7.27.1" - dependencies: - "@babel/helper-member-expression-to-functions": "npm:^7.27.1" - "@babel/helper-optimise-call-expression": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/72e3f8bef744c06874206bf0d80a0abbedbda269586966511c2491df4f6bf6d47a94700810c7a6737345a545dfb8295222e1e72f506bcd0b40edb3f594f739ea - languageName: node - linkType: hard - -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.27.1" - dependencies: - "@babel/traverse": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" - checksum: 10/4f380c5d0e0769fa6942a468b0c2d7c8f0c438f941aaa88f785f8752c103631d0904c7b4e76207a3b0e6588b2dec376595370d92ca8f8f1b422c14a69aa146d4 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helper-string-parser@npm:7.29.7" - checksum: 10/4d8ef0ef7105f3d9fe4361137c8f42e5b4c7a52b5380b962762f2a528a1ba89064e2c6236090716ce34b63707b886ae0ebf36b2c2fcc2851f27e652febfc3648 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.28.5, @babel/helper-validator-identifier@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helper-validator-identifier@npm:7.29.7" - checksum: 10/2efa42701eb05babf26dff3332109c9e5e1a3400a71fb9e68ee27af28235036a2a72c2494c04bdab3f909075f42a58b2e8271074372bc7f8e79ec02bd364d7a7 - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.27.1, @babel/helper-validator-option@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helper-validator-option@npm:7.29.7" - checksum: 10/aeb6aa966f59300d3cc2fea7c68e1dfd7ad011fc10e535c8e2b2de3094b27c859428dc7220f16420350f8b1cde99da120b673be04bcb0c2f37b56258c96bed58 - languageName: node - linkType: hard - -"@babel/helper-wrap-function@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-wrap-function@npm:7.27.1" - dependencies: - "@babel/template": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" - checksum: 10/effa5ba1732764982db52295a0003d0d6b527edf70d8c649f5a521808decbc47fc8f3c21cd31f7b6331192289f3bf5617141bce778fec45dcaedf5708d9c3140 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helpers@npm:7.29.7" - dependencies: - "@babel/template": "npm:^7.29.7" - "@babel/types": "npm:^7.29.7" - checksum: 10/b4d1ef12c19e896585c009ba29677839097ff04f8b11a2430d335c3fb6bd667b4f9e96a3b185a083fdde6b1137eabbbf2600c32425cb69cefc81d81d5cfe425d - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.0.0": - version: 7.25.9 - resolution: "@babel/highlight@npm:7.25.9" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.9" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10/0d165283dd4eb312292cea8fec3ae0d376874b1885f476014f0136784ed5b564b2c2ba2d270587ed546ee92505056dab56493f7960c01c4e6394d71d1b2e7db6 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.29.7, @babel/parser@npm:^7.29.8": - version: 7.29.8 - resolution: "@babel/parser@npm:7.29.8" - dependencies: - "@babel/types": "npm:^7.29.8" - bin: - parser: ./bin/babel-parser.js - checksum: 10/dbd14ebbba0fa3019acd2712b0db3ffd594d0850d4fc487667287b5702893f54a7911570ea842f0cff4dc492a2412e3287dfabfe00c6b78efa7becb1255f3f86 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/fe65257d5b82558bc6bc0f3a5a7a35b4166f71bed3747714dafb6360fadb15f036d568bc1fbeedae819165008c8feb646633ab91c0e3a95284963972f4fa9751 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/eb7f4146dc01f1198ce559a90b077e58b951a07521ec414e3c7d4593bf6c4ab5c2af22242a7e9fec085e20299e0ba6ea97f44a45e84ab148141bf9eb959ad25e - languageName: node - linkType: hard - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/621cfddfcc99a81e74f8b6f9101fd260b27500cb1a568e3ceae9cc8afe9aee45ac3bca3900a2b66c612b1a2366d29ef67d4df5a1c975be727eaad6906f98c2c6 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" - "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.13.0 - checksum: 10/f07aa80272bd7a46b7ba11a4644da6c9b6a5a64e848dfaffdad6f02663adefd512e1aaebe664c4dd95f7ed4f80c872c7f8db8d8e34b47aae0930b412a28711a0 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/dfa68da5f68c0fa9deff1739ac270a5643ea07540b26a2a05403bc536c96595f0fe98a5eac9f9b3501b79ce57caa3045a94c75d5ccbfed946a62469a370ecdc2 - languageName: node - linkType: hard - -"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": - version: 7.21.0-placeholder-for-preset-env.2 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/fab70f399aa869275690ec6c7cedb4ef361d4e8b6f55c3d7b04bfee61d52fb93c87cec2c65d73cddbaca89fb8ef5ec0921fce675c9169d9d51f18305ab34e78a - languageName: node - linkType: hard - -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 - languageName: node - linkType: hard - -"@babel/plugin-syntax-bigint@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-properties@npm:^7.12.13": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.12.13" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-static-block@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/3e80814b5b6d4fe17826093918680a351c2d34398a914ce6e55d8083d72a9bdde4fbaf6a2dcea0e23a03de26dc2917ae3efd603d27099e2b98380345703bf948 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-assertions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/fb661d630808d67ecb85eabad25aac4e9696a20464bad4c4a6a0d3d40e4dc22557d47e9be3d591ec06429cf048cfe169b8891c373606344d51c4f3ac0f91d6d0 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-attributes@npm:^7.24.7, @babel/plugin-syntax-import-attributes@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/97973982fff1bbf86b3d1df13380567042887c50e2ae13a400d02a8ff2c9742a60a75e279bfb73019e1cd9710f04be5e6ab81f896e6678dcfcec8b135e8896cf - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-meta@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b - languageName: node - linkType: hard - -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a - languageName: node - linkType: hard - -"@babel/plugin-syntax-jsx@npm:^7.27.1, @babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.27.1 - resolution: "@babel/plugin-syntax-jsx@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/c6d1324cff286a369aa95d99b8abd21dd07821b5d3affd5fe7d6058c84cff9190743287826463ee57a7beecd10fa1e4bc99061df532ee14e188c1c8937b13e3a - languageName: node - linkType: hard - -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 - languageName: node - linkType: hard - -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 - languageName: node - linkType: hard - -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 - languageName: node - linkType: hard - -"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 - languageName: node - linkType: hard - -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda - languageName: node - linkType: hard - -"@babel/plugin-syntax-top-level-await@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e - languageName: node - linkType: hard - -"@babel/plugin-syntax-typescript@npm:^7.27.1, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.27.1 - resolution: "@babel/plugin-syntax-typescript@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/87836f7e32af624c2914c73cd6b9803cf324e07d43f61dbb973c6a86f75df725e12540d91fac7141c14b697aa9268fd064220998daced156e96ac3062d7afb41 - languageName: node - linkType: hard - -"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.18.6" - "@babel/helper-plugin-utils": "npm:^7.18.6" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/a651d700fe63ff0ddfd7186f4ebc24447ca734f114433139e3c027bc94a900d013cf1ef2e2db8430425ba542e39ae160c3b05f06b59fd4656273a3df97679e9c - languageName: node - linkType: hard - -"@babel/plugin-transform-arrow-functions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/62c2cc0ae2093336b1aa1376741c5ed245c0987d9e4b4c5313da4a38155509a7098b5acce582b6781cc0699381420010da2e3086353344abe0a6a0ec38961eb7 - languageName: node - linkType: hard - -"@babel/plugin-transform-async-generator-functions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-remap-async-to-generator": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/92e8ba589e8b128255846375e13fee30a3b77c889578f1f30da57ee26133f397dbbc81b27e1f19c12080b096930e62bce1dcbaa7a1453d296f51eb8bda3b8d39 - languageName: node - linkType: hard - -"@babel/plugin-transform-async-to-generator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.27.1" - dependencies: - "@babel/helper-module-imports": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-remap-async-to-generator": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/d79d7a7ae7d416f6a48200017d027a6ba94c09c7617eea8b4e9c803630f00094c1a4fc32bf20ce3282567824ce3fcbda51653aac4003c71ea4e681b331338979 - languageName: node - linkType: hard - -"@babel/plugin-transform-block-scoped-functions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/7fb4988ca80cf1fc8345310d5edfe38e86b3a72a302675cdd09404d5064fe1d1fe1283ebe658ad2b71445ecef857bfb29a748064306b5f6c628e0084759c2201 - languageName: node - linkType: hard - -"@babel/plugin-transform-block-scoping@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-block-scoping@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/1afed217e44de8d1ad30eccd9d3ba30627798718db3c58430413ebaeb3488620bf2b16c5bfb54b1bb8935635fb5583c9dd53ea8588e9674e6c9478e7b03f94ca - languageName: node - linkType: hard - -"@babel/plugin-transform-class-properties@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/475a6e5a9454912fe1bdc171941976ca10ea4e707675d671cdb5ce6b6761d84d1791ac61b6bca81a2e5f6430cb7b9d8e4b2392404110e69c28207a754e196294 - languageName: node - linkType: hard - -"@babel/plugin-transform-class-static-block@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-class-static-block@npm:7.27.1" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.12.0 - checksum: 10/2d49de0f5ffc66ae873be1d8c3bf4d22e51889cc779d534e4dbda0f91e36907479e5c650b209fcfc80f922a6c3c2d76c905fc2f5dc78cc9a836f8c31b10686c4 - languageName: node - linkType: hard - -"@babel/plugin-transform-classes@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-classes@npm:7.27.1" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-compilation-targets": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-replace-supers": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - globals: "npm:^11.1.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/4ac2224fa68b933c80b4755300d795e055f6fb18c51432e9a4c048edcd6c64cae097eb9063d25f6c7e706ecd85a4c0b89b6f89b320b5798e3139c9cc4ff99f61 - languageName: node - linkType: hard - -"@babel/plugin-transform-computed-properties@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-computed-properties@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/template": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/101f6d4575447070943d5a9efaa5bea8c552ea3083d73a9612f1a16d38b0a0a7b79a5feb65c6cc4e4fcabf28e85a570b97ccd3294da966e8fbbb6dfb97220eda - languageName: node - linkType: hard - -"@babel/plugin-transform-destructuring@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-destructuring@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/8a128e80135985a9a8f403f8c684f65c0eacb6d5295567c38b1b67dc8717821894c8a004977381c7bb82c647678521f063c981afd9d1141b25df838ad0e8c1b2 - languageName: node - linkType: hard - -"@babel/plugin-transform-dotall-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.27.1" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/2173e5b13f403538ffc6bd57b190cedf4caf320abc13a99e5b2721864e7148dbd3bd7c82d92377136af80432818f665fdd9a1fd33bc5549a4c91e24e5ce2413c - languageName: node - linkType: hard - -"@babel/plugin-transform-duplicate-keys@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/987b718d2fab7626f61b72325c8121ead42341d6f46ad3a9b5e5f67f3ec558c903f1b8336277ffc43caac504ce00dd23a5456b5d1da23913333e1da77751f08d - languageName: node - linkType: hard - -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.27.1" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/2a109613535e6ac79240dced71429e988affd6a5b3d0cd0f563c8d6c208c51ce7bf2c300bc1150502376b26a51f279119b3358f1c0f2d2f8abca3bcd62e1ae46 - languageName: node - linkType: hard - -"@babel/plugin-transform-dynamic-import@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/7a9fbc8d17148b7f11a1d1ca3990d2c2cd44bd08a45dcaf14f20a017721235b9044b20e6168b6940282bb1b48fb78e6afbdfb9dd9d82fde614e15baa7d579932 - languageName: node - linkType: hard - -"@babel/plugin-transform-exponentiation-operator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/dbbedd24724c2d590ef59d32cb1fef34e99daba41c5b621f9f4c4da23e15c2bb4b1e3d954c314645016391404cf00f1e4ddec8f1f7891438bcde9aaf16e16ee0 - languageName: node - linkType: hard - -"@babel/plugin-transform-export-namespace-from@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/85082923eca317094f08f4953d8ea2a6558b3117826c0b740676983902b7236df1f4213ad844cb38c2dae104753dbe8f1cc51f01567835d476d32f5f544a4385 - languageName: node - linkType: hard - -"@babel/plugin-transform-for-of@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-for-of@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/705c591d17ef263c309bba8c38e20655e8e74ff7fd21883a9cdaf5bf1df42d724383ad3d88ac01f42926e15b1e1e66f2f7f8c4e87de955afffa290d52314b019 - languageName: node - linkType: hard - -"@babel/plugin-transform-function-name@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-function-name@npm:7.27.1" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/26a2a183c3c52a96495967420a64afc5a09f743a230272a131668abf23001e393afa6371e6f8e6c60f4182bea210ed31d1caf866452d91009c1daac345a52f23 - languageName: node - linkType: hard - -"@babel/plugin-transform-json-strings@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-json-strings@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/2c05a02f63b49f47069271b3405a66c3c8038de5b995b0700b1bd9a5e2bb3e67abd01e4604629302a521f4d8122a4233944aefa16559fd4373d256cc5d3da57f - languageName: node - linkType: hard - -"@babel/plugin-transform-literals@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-literals@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/0a76d12ab19f32dd139964aea7da48cecdb7de0b75e207e576f0f700121fe92367d788f328bf4fb44b8261a0f605c97b44e62ae61cddbb67b14e94c88b411f95 - languageName: node - linkType: hard - -"@babel/plugin-transform-logical-assignment-operators@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/2757955d81d65cc4701c17b83720745f6858f7a1d1d58117e379c204f47adbeb066b778596b6168bdbf4a22c229aab595d79a9abc261d0c6bfd62d4419466e73 - languageName: node - linkType: hard - -"@babel/plugin-transform-member-expression-literals@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/804121430a6dcd431e6ffe99c6d1fbbc44b43478113b79c677629e7f877b4f78a06b69c6bfb2747fd84ee91879fe2eb32e4620b53124603086cf5b727593ebe8 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-amd@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-modules-amd@npm:7.27.1" - dependencies: - "@babel/helper-module-transforms": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/5ca9257981f2bbddd9dccf9126f1368de1cb335e7a5ff5cca9282266825af5b18b5f06c144320dcf5d2a200d2b53b6d22d9b801a55dc0509ab5a5838af7e61b7 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-commonjs@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.27.1" - dependencies: - "@babel/helper-module-transforms": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/9059243a977bc1f13e3dccfc6feb6508890e7c7bb191f7eb56626b20672b4b12338051ca835ab55426875a473181502c8f35b4df58ba251bef63b25866d995fe - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-systemjs@npm:^7.27.1": - version: 7.29.4 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.29.4" - dependencies: - "@babel/helper-module-transforms": "npm:^7.28.6" - "@babel/helper-plugin-utils": "npm:^7.28.6" - "@babel/helper-validator-identifier": "npm:^7.28.5" - "@babel/traverse": "npm:^7.29.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/79269e6ec8ec831bb63bf1c7cc1a980e28da785e92b36d42612f0139e4044499b99aa109fca849e1a156c092aabf6c24d145f4cabf2ac9ea84ef468852fe4c03 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-umd@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-modules-umd@npm:7.27.1" - dependencies: - "@babel/helper-module-transforms": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/7388932863b4ee01f177eb6c2e2df9e2312005e43ada99897624d5565db4b9cef1e30aa7ad2c79bbe5373f284cfcddea98d8fe212714a24c6aba223272163058 - languageName: node - linkType: hard - -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.27.1" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/a711c92d9753df26cefc1792481e5cbff4fe4f32b383d76b25e36fa865d8023b1b9aa6338cf18f5c0e864c71a7fbe8115e840872ccd61a914d9953849c68de7d - languageName: node - linkType: hard - -"@babel/plugin-transform-new-target@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-new-target@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/620d78ee476ae70960989e477dc86031ffa3d554b1b1999e6ec95261629f7a13e5a7b98579c63a009f9fdf14def027db57de1f0ae1f06fb6eaed8908ff65cf68 - languageName: node - linkType: hard - -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/15333f4888ffedc449a2a21a0b1ca7983e089f43faa00cfb71d2466e20221a5fd979cdb1a3f57bc20fc62c67bd3ff3dde054133fb6324a58be8f64d20aefacd2 - languageName: node - linkType: hard - -"@babel/plugin-transform-numeric-separator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/049b958911de86d32408cd78017940a207e49c054ae9534ab53a32a57122cc592c0aae3c166d6f29bd1a7d75cc779d71883582dd76cb28b2fbb493e842d8ffca - languageName: node - linkType: hard - -"@babel/plugin-transform-object-rest-spread@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.27.2" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.27.1" - "@babel/plugin-transform-parameters": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/284a458f229e2acabe8a4d3a6cb1cb510dd1d76dc652d220865b8008b4cad923cea5faf76a8990810c2f99704797fbebb2ff15d482c448193691985a71226ecf - languageName: node - linkType: hard - -"@babel/plugin-transform-object-super@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-object-super@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-replace-supers": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/46b819cb9a6cd3cfefe42d07875fee414f18d5e66040366ae856116db560ad4e16f3899a0a7fddd6773e0d1458444f94b208b67c0e3b6977a27ea17a5c13dbf6 - languageName: node - linkType: hard - -"@babel/plugin-transform-optional-catch-binding@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/f4356b04cf21a98480f9788ea50f1f13ee88e89bb6393ba4b84d1f39a4a84c7928c9a4328e8f4c5b6deb218da68a8fd17bf4f46faec7653ddc20ffaaa5ba49f4 - languageName: node - linkType: hard - -"@babel/plugin-transform-optional-chaining@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/34b0f96400c259a2722740d17a001fe45f78d8ff052c40e29db2e79173be72c1cfe8d9681067e3f5da3989e4a557402df5c982c024c18257587a41e022f95640 - languageName: node - linkType: hard - -"@babel/plugin-transform-parameters@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-parameters@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/47db574f8f3adf7a5d85933c9a2a2dee956ceda9e00fb4e03e9a9d600b559f06cba2da7c5e78a12b05dcf993cf147634edf0391f3f20a6b451830f41be47fe68 + "@babel/types": "npm:^7.29.7" + checksum: 10/28ec6f7efd99588d6eebfb25c9f1ccc34cb0cdb0839c4c0f08b3ec0105ccaefbe7e8b4f651f3f55a4f5c4fcb1d979bd32a9b8ee23e3e62163ea22aaa7ee0dfa1 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-private-methods@npm:7.27.1" +"@babel/helper-module-transforms@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-module-transforms@npm:7.29.7" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-module-imports": "npm:^7.29.7" + "@babel/helper-validator-identifier": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/c76f8f6056946466116e67eb9d8014a2d748ade2062636ab82045c1dac9c233aff10e597777bc5af6f26428beb845ceb41b95007abef7d0484da95789da56662 + "@babel/core": ^7.0.0 + checksum: 10/33251b1fb44d726194a974a0078b1269511d130a2609357ff829b479e9e4dca96ecd5384c534a477095f665ffb01503d3e680699c2002e5b62e6ca1a272f1892 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.27.1" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/d4466d42a02c5a318d9d7b8102969fd032b17ff044918dfd462d5cc49bd11f5773ee0794781702afdf4727ba11e9be6cbea1e396bc0a7307761bb9a56399012a +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.28.6 + resolution: "@babel/helper-plugin-utils@npm:7.28.6" + checksum: 10/21c853bbc13dbdddf03309c9a0477270124ad48989e1ad6524b83e83a77524b333f92edd2caae645c5a7ecf264ec6d04a9ebe15aeb54c7f33c037b71ec521e4a languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-property-literals@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/7caec27d5ed8870895c9faf4f71def72745d69da0d8e77903146a4e135fd7bed5778f5f9cebb36c5fba86338e6194dd67a08c033fc84b4299b7eceab6d9630cb +"@babel/helper-string-parser@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-string-parser@npm:7.29.7" + checksum: 10/4d8ef0ef7105f3d9fe4361137c8f42e5b4c7a52b5380b962762f2a528a1ba89064e2c6236090716ce34b63707b886ae0ebf36b2c2fcc2851f27e652febfc3648 languageName: node linkType: hard -"@babel/plugin-transform-react-constant-elements@npm:^7.18.12": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-constant-elements@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/906ea336502a42ca942f492f386111db4041c28c08f9dcc63eb816b75a1a96121505c1522c5e721dd192bf42a244799b78a8991e4abbf3fa17748dac1b6f142e +"@babel/helper-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-validator-identifier@npm:7.29.7" + checksum: 10/2efa42701eb05babf26dff3332109c9e5e1a3400a71fb9e68ee27af28235036a2a72c2494c04bdab3f909075f42a58b2e8271074372bc7f8e79ec02bd364d7a7 languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-display-name@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/5c794e91da4f27b39314b5354bbede049074c04646949ad3a4c5788b9a1a6fa649d2f0fa95587209219443c97127e0cfa41ab56a3eaf68e91a319948518f8357 +"@babel/helper-validator-option@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-validator-option@npm:7.29.7" + checksum: 10/aeb6aa966f59300d3cc2fea7c68e1dfd7ad011fc10e535c8e2b2de3094b27c859428dc7220f16420350f8b1cde99da120b673be04bcb0c2f37b56258c96bed58 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-development@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.27.1" +"@babel/helpers@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helpers@npm:7.29.7" dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/b88865d5b8c018992f2332da939faa15c4d4a864c9435a5937beaff3fe43781432cc42e0a5d5631098e0bd4066fc33f5fa72203b388b074c3545fe7aaa21e474 + "@babel/template": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10/b4d1ef12c19e896585c009ba29677839097ff04f8b11a2430d335c3fb6bd667b4f9e96a3b185a083fdde6b1137eabbbf2600c32425cb69cefc81d81d5cfe425d languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-jsx@npm:7.27.1" +"@babel/highlight@npm:^7.0.0": + version: 7.25.9 + resolution: "@babel/highlight@npm:7.25.9" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-module-imports": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/plugin-syntax-jsx": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/e865f194770906398957df23530af9a46009ac3737aaa10026b3925fe0a38fc3254f4b227d3b8807ab66ac92c14323bef561dd2217644052de5a9702af76e2f6 + "@babel/helper-validator-identifier": "npm:^7.25.9" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/0d165283dd4eb312292cea8fec3ae0d376874b1885f476014f0136784ed5b564b2c2ba2d270587ed546ee92505056dab56493f7960c01c4e6394d71d1b2e7db6 languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.27.1" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.29.7, @babel/parser@npm:^7.29.8": + version: 7.29.8 + resolution: "@babel/parser@npm:7.29.8" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/a6f591c5e85a1ab0685d4a25afe591fe8d11dc0b73c677cf9560ff8d540d036a1cce9efcb729fc9092def4d854dc304ffdc063a89a9247900b69c516bf971a4c + "@babel/types": "npm:^7.29.8" + bin: + parser: ./bin/babel-parser.js + checksum: 10/dbd14ebbba0fa3019acd2712b0db3ffd594d0850d4fc487667287b5702893f54a7911570ea842f0cff4dc492a2412e3287dfabfe00c6b78efa7becb1255f3f86 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-regenerator@npm:7.27.1" +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a6a3f818e4cc5ac5a01962a1d66515cb6791f32eb1dcd810dbb39f6e580c0c96b47fcc5c5633137e040f4e137e40e6f4dad8a3d57d49b15aed40e72e13e30d93 + checksum: 10/7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 languageName: node linkType: hard -"@babel/plugin-transform-regexp-modifiers@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.27.1" +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/f6cb385fe0e798bff7e9b20cf5912bf40e180895ff3610b1ccdce260f3c20daaebb3a99dc087c8168a99151cd3e16b94f4689fd5a4b01cf1834b45c133e620b2 + "@babel/core": ^7.0.0-0 + checksum: 10/3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-reserved-words@npm:7.27.1" +"@babel/plugin-syntax-class-properties@npm:^7.12.13": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.12.13" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/dea0b66742d2863b369c06c053e11e15ba785892ea19cccf7aef3c1bdaa38b6ab082e19984c5ea7810d275d9445c5400fcc385ad71ce707ed9256fadb102af3b + checksum: 10/24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" +"@babel/plugin-syntax-class-static-block@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/fbba6e2aef0b69681acb68202aa249c0598e470cc0853d7ff5bd0171fd6a7ec31d77cfabcce9df6360fc8349eded7e4a65218c32551bd3fc0caaa1ac899ac6d4 + checksum: 10/3e80814b5b6d4fe17826093918680a351c2d34398a914ce6e55d8083d72a9bdde4fbaf6a2dcea0e23a03de26dc2917ae3efd603d27099e2b98380345703bf948 languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.27.1": +"@babel/plugin-syntax-import-attributes@npm:^7.24.7": version: 7.27.1 - resolution: "@babel/plugin-transform-spread@npm:7.27.1" + resolution: "@babel/plugin-syntax-import-attributes@npm:7.27.1" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/3edd28b07e1951f32aa2d380d9a0e0ed408c64a5cea2921d02308541042aca18f146b3a61e82e534d4d61cb3225dbc847f4f063aedfff6230b1a41282e95e8a2 + checksum: 10/97973982fff1bbf86b3d1df13380567042887c50e2ae13a400d02a8ff2c9742a60a75e279bfb73019e1cd9710f04be5e6ab81f896e6678dcfcec8b135e8896cf languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.27.1" +"@babel/plugin-syntax-import-meta@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e1414a502efba92c7974681767e365a8cda6c5e9e5f33472a9eaa0ce2e75cea0a9bef881ff8dda37c7810ad902f98d3c00ead92a3ac3b73a79d011df85b5a189 + checksum: 10/166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-template-literals@npm:7.27.1" +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/93aad782503b691faef7c0893372d5243df3219b07f1f22cfc32c104af6a2e7acd6102c128439eab15336d048f1b214ca134b87b0630d8cd568bf447f78b25ce + checksum: 10/bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.27.1": +"@babel/plugin-syntax-jsx@npm:^7.27.1, @babel/plugin-syntax-jsx@npm:^7.7.2": version: 7.27.1 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.1" + resolution: "@babel/plugin-syntax-jsx@npm:7.27.1" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/812d736402a6f9313b86b8adf36740394400be7a09c48e51ee45ab4a383a3f46fc618d656dd12e44934665e42ae71cf143e25b95491b699ef7c737950dbdb862 + checksum: 10/c6d1324cff286a369aa95d99b8abd21dd07821b5d3affd5fe7d6058c84cff9190743287826463ee57a7beecd10fa1e4bc99061df532ee14e188c1c8937b13e3a languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-typescript@npm:7.27.1" +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" - "@babel/plugin-syntax-typescript": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/069b37c5beeb613635e65a3024d6f5f3da09c82137e055a7d413bfd2778d623879bd7b2985466fb66f8a32e805a9bf6aa7e336e6bfcf0304c869bb850e8400c9 + checksum: 10/aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.27.1" +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/87b9e49dee4ab6e78f4cdcdbdd837d7784f02868a96bfc206c8dbb17dd85db161b5a0ecbe95b19a42e8aea0ce57e80249e1facbf9221d7f4114d52c3b9136c9e + checksum: 10/87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.27.1" +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.10.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5d99c89537d1ebaac3f526c04b162cf95a47d363d4829f78c6701a2c06ab78a48da66a94f853f85f44a3d72153410ba923e072bed4b7166fa097f503eb14131d + checksum: 10/01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a34d89a2b75fb78e66d97c3dc90d4877f7e31f43316b52176f95a5dee20e9bb56ecf158eafc42a001676ddf7b393d9e67650bad6b32f5405780f25fb83cd68e3 + checksum: 10/fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.27.1" +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/295126074c7388ab05c82ef3ed0907a1ee4666bbdd763477ead9aba6eb2c74bdf65669416861ac93d337a4a27640963bb214acadc2697275ce95aab14868d57f + "@babel/core": ^7.0.0-0 + checksum: 10/910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 languageName: node linkType: hard -"@babel/preset-env@npm:^7.19.4": - version: 7.27.2 - resolution: "@babel/preset-env@npm:7.27.2" +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" dependencies: - "@babel/compat-data": "npm:^7.27.2" - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-validator-option": "npm:^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.27.1" - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.27.1" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.27.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.27.1" - "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions": "npm:^7.27.1" - "@babel/plugin-syntax-import-attributes": "npm:^7.27.1" - "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" - "@babel/plugin-transform-async-generator-functions": "npm:^7.27.1" - "@babel/plugin-transform-async-to-generator": "npm:^7.27.1" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.27.1" - "@babel/plugin-transform-block-scoping": "npm:^7.27.1" - "@babel/plugin-transform-class-properties": "npm:^7.27.1" - "@babel/plugin-transform-class-static-block": "npm:^7.27.1" - "@babel/plugin-transform-classes": "npm:^7.27.1" - "@babel/plugin-transform-computed-properties": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.27.1" - "@babel/plugin-transform-dotall-regex": "npm:^7.27.1" - "@babel/plugin-transform-duplicate-keys": "npm:^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.27.1" - "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.27.1" - "@babel/plugin-transform-export-namespace-from": "npm:^7.27.1" - "@babel/plugin-transform-for-of": "npm:^7.27.1" - "@babel/plugin-transform-function-name": "npm:^7.27.1" - "@babel/plugin-transform-json-strings": "npm:^7.27.1" - "@babel/plugin-transform-literals": "npm:^7.27.1" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.27.1" - "@babel/plugin-transform-member-expression-literals": "npm:^7.27.1" - "@babel/plugin-transform-modules-amd": "npm:^7.27.1" - "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" - "@babel/plugin-transform-modules-systemjs": "npm:^7.27.1" - "@babel/plugin-transform-modules-umd": "npm:^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.27.1" - "@babel/plugin-transform-new-target": "npm:^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.27.1" - "@babel/plugin-transform-numeric-separator": "npm:^7.27.1" - "@babel/plugin-transform-object-rest-spread": "npm:^7.27.2" - "@babel/plugin-transform-object-super": "npm:^7.27.1" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.27.1" - "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" - "@babel/plugin-transform-parameters": "npm:^7.27.1" - "@babel/plugin-transform-private-methods": "npm:^7.27.1" - "@babel/plugin-transform-private-property-in-object": "npm:^7.27.1" - "@babel/plugin-transform-property-literals": "npm:^7.27.1" - "@babel/plugin-transform-regenerator": "npm:^7.27.1" - "@babel/plugin-transform-regexp-modifiers": "npm:^7.27.1" - "@babel/plugin-transform-reserved-words": "npm:^7.27.1" - "@babel/plugin-transform-shorthand-properties": "npm:^7.27.1" - "@babel/plugin-transform-spread": "npm:^7.27.1" - "@babel/plugin-transform-sticky-regex": "npm:^7.27.1" - "@babel/plugin-transform-template-literals": "npm:^7.27.1" - "@babel/plugin-transform-typeof-symbol": "npm:^7.27.1" - "@babel/plugin-transform-unicode-escapes": "npm:^7.27.1" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.27.1" - "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.27.1" - "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.11.0" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.40.0" - semver: "npm:^6.3.1" + "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/3748b5e5582bee12f2b21ee4af9552a0ea8851fdfa8e54cdab142ac9191b7e9b1673d23056c0d2c3c6fd554eb85873664acfc9829c4f14a8ae7676548184eff6 + checksum: 10/eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 languageName: node linkType: hard -"@babel/preset-modules@npm:0.1.6-no-external-plugins": - version: 0.1.6-no-external-plugins - resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" +"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" dependencies: - "@babel/helper-plugin-utils": "npm:^7.0.0" - "@babel/types": "npm:^7.4.4" - esutils: "npm:^2.0.2" + "@babel/helper-plugin-utils": "npm:^7.14.5" peerDependencies: - "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 - checksum: 10/039aba98a697b920d6440c622aaa6104bb6076d65356b29dad4b3e6627ec0354da44f9621bafbeefd052cd4ac4d7f88c9a2ab094efcb50963cb352781d0c6428 + "@babel/core": ^7.0.0-0 + checksum: 10/b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda languageName: node linkType: hard -"@babel/preset-react@npm:^7.18.6": - version: 7.27.1 - resolution: "@babel/preset-react@npm:7.27.1" +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-validator-option": "npm:^7.27.1" - "@babel/plugin-transform-react-display-name": "npm:^7.27.1" - "@babel/plugin-transform-react-jsx": "npm:^7.27.1" - "@babel/plugin-transform-react-jsx-development": "npm:^7.27.1" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/26dd63164ada235ddca53c074944f52cea9a6d8064d02871cad672fe92cc2e136dd1809fb61fa0313a3c19d8e32a00a667d0cbd79465ad8460e2c1b88e5509ae + checksum: 10/bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.18.6": +"@babel/plugin-syntax-typescript@npm:^7.27.1, @babel/plugin-syntax-typescript@npm:^7.7.2": version: 7.27.1 - resolution: "@babel/preset-typescript@npm:7.27.1" + resolution: "@babel/plugin-syntax-typescript@npm:7.27.1" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-validator-option": "npm:^7.27.1" - "@babel/plugin-syntax-jsx": "npm:^7.27.1" - "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" - "@babel/plugin-transform-typescript": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9d8e75326b3c93fa016ba7aada652800fc77bc05fcc181888700a049935e8cf1284b549de18a5d62ef3591d02f097ea6de1111f7d71a991aaf36ba74657bd145 + checksum: 10/87836f7e32af624c2914c73cd6b9803cf324e07d43f61dbb973c6a86f75df725e12540d91fac7141c14b697aa9268fd064220998daced156e96ac3062d7afb41 languageName: node linkType: hard -"@babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6": +"@babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.5.5": version: 7.27.1 resolution: "@babel/runtime@npm:7.27.1" checksum: 10/34cefcbf781ea5a4f1b93f8563327b9ac82694bebdae91e8bd9d7f58d084cbe5b9a6e7f94d77076e15b0bcdaa0040a36cb30737584028df6c4673b4c67b2a31d languageName: node linkType: hard -"@babel/template@npm:^7.27.1, @babel/template@npm:^7.29.7, @babel/template@npm:^7.3.3": +"@babel/template@npm:^7.29.7, @babel/template@npm:^7.3.3": version: 7.29.7 resolution: "@babel/template@npm:7.29.7" dependencies: @@ -1447,7 +451,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.29.0, @babel/traverse@npm:^7.29.7": +"@babel/traverse@npm:^7.29.7": version: 7.29.8 resolution: "@babel/traverse@npm:7.29.8" dependencies: @@ -1462,7 +466,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.29.7, @babel/types@npm:^7.29.8, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.3, @babel/types@npm:^7.29.7, @babel/types@npm:^7.29.8, @babel/types@npm:^7.3.3": version: 7.29.8 resolution: "@babel/types@npm:7.29.8" dependencies: @@ -2186,29 +1190,6 @@ __metadata: languageName: node linkType: hard -"@backstage/core-plugin-api@npm:~1.12.7": - version: 1.12.8 - resolution: "@backstage/core-plugin-api@npm:1.12.8" - dependencies: - "@backstage/config": "npm:^1.3.8" - "@backstage/errors": "npm:^1.3.1" - "@backstage/frontend-plugin-api": "npm:^0.17.3" - "@backstage/types": "npm:^1.2.2" - "@backstage/version-bridge": "npm:^1.0.12" - history: "npm:^5.0.0" - zod: "npm:^3.25.76 || ^4.0.0" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.30.2 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10/7e746a509bf684fcf4bcd3e8333af29cb1a135717d259eabf18bafbbdf00a08bbf7c6f429e2b8144db130e464f2cd7e7d40cbea4f6c334c02d4a808c7a025214 - languageName: node - linkType: hard - "@backstage/errors@npm:^1.3.1, @backstage/errors@npm:~1.3.1": version: 1.3.1 resolution: "@backstage/errors@npm:1.3.1" @@ -2242,30 +1223,6 @@ __metadata: languageName: node linkType: hard -"@backstage/frontend-plugin-api@npm:^0.17.3": - version: 0.17.3 - resolution: "@backstage/frontend-plugin-api@npm:0.17.3" - dependencies: - "@backstage/config": "npm:^1.3.8" - "@backstage/errors": "npm:^1.3.1" - "@backstage/filter-predicates": "npm:^0.1.4" - "@backstage/types": "npm:^1.2.2" - "@backstage/version-bridge": "npm:^1.0.12" - "@standard-schema/spec": "npm:^1.1.0" - zod: "npm:^4.0.0" - zod-to-json-schema: "npm:^3.25.1" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.30.2 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10/16da36c4d922b0ac0d5a146476ad00bc82bb1033a164be5f5f9d282a144c06a5ea7d3a093993133521bbcf865f543194d065079660137931d0f7d5a263bd8472 - languageName: node - linkType: hard - "@backstage/module-federation-common@npm:^0.1.4": version: 0.1.4 resolution: "@backstage/module-federation-common@npm:0.1.4" @@ -2447,21 +1404,6 @@ __metadata: languageName: node linkType: hard -"@backstage/version-bridge@npm:^1.0.12": - version: 1.0.12 - resolution: "@backstage/version-bridge@npm:1.0.12" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.30.2 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10/a577e272e0c5ca1aa6cd5222faa33b44bd98ee9c777ce05d0c9904cc2d70b002be0a8467d8e4228f74fc0da5a95d08d2c413f091e74d34eb3d658b152338692f - languageName: node - linkType: hard - "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -2587,13 +1529,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/aix-ppc64@npm:0.28.1" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/android-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/android-arm64@npm:0.27.7" @@ -2601,13 +1536,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/android-arm64@npm:0.28.1" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/android-arm@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/android-arm@npm:0.27.7" @@ -2615,23 +1543,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/android-arm@npm:0.28.1" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/android-x64@npm:0.27.7" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/android-x64@npm:0.28.1" +"@esbuild/android-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-x64@npm:0.27.7" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -2643,13 +1557,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/darwin-arm64@npm:0.28.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/darwin-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/darwin-x64@npm:0.27.7" @@ -2657,13 +1564,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/darwin-x64@npm:0.28.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@esbuild/freebsd-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/freebsd-arm64@npm:0.27.7" @@ -2671,13 +1571,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/freebsd-arm64@npm:0.28.1" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/freebsd-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/freebsd-x64@npm:0.27.7" @@ -2685,13 +1578,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/freebsd-x64@npm:0.28.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/linux-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-arm64@npm:0.27.7" @@ -2699,13 +1585,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-arm64@npm:0.28.1" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/linux-arm@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-arm@npm:0.27.7" @@ -2713,13 +1592,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-arm@npm:0.28.1" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "@esbuild/linux-ia32@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-ia32@npm:0.27.7" @@ -2727,13 +1599,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-ia32@npm:0.28.1" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/linux-loong64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-loong64@npm:0.27.7" @@ -2741,13 +1606,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-loong64@npm:0.28.1" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - "@esbuild/linux-mips64el@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-mips64el@npm:0.27.7" @@ -2755,13 +1613,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-mips64el@npm:0.28.1" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - "@esbuild/linux-ppc64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-ppc64@npm:0.27.7" @@ -2769,13 +1620,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-ppc64@npm:0.28.1" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/linux-riscv64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-riscv64@npm:0.27.7" @@ -2783,13 +1627,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-riscv64@npm:0.28.1" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - "@esbuild/linux-s390x@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-s390x@npm:0.27.7" @@ -2797,13 +1634,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-s390x@npm:0.28.1" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - "@esbuild/linux-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-x64@npm:0.27.7" @@ -2811,13 +1641,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-x64@npm:0.28.1" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - "@esbuild/netbsd-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/netbsd-arm64@npm:0.27.7" @@ -2825,13 +1648,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/netbsd-arm64@npm:0.28.1" - conditions: os=netbsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/netbsd-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/netbsd-x64@npm:0.27.7" @@ -2839,13 +1655,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/netbsd-x64@npm:0.28.1" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/openbsd-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/openbsd-arm64@npm:0.27.7" @@ -2853,13 +1662,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/openbsd-arm64@npm:0.28.1" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/openbsd-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/openbsd-x64@npm:0.27.7" @@ -2867,13 +1669,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/openbsd-x64@npm:0.28.1" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/openharmony-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/openharmony-arm64@npm:0.27.7" @@ -2881,13 +1676,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openharmony-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/openharmony-arm64@npm:0.28.1" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/sunos-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/sunos-x64@npm:0.27.7" @@ -2895,13 +1683,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/sunos-x64@npm:0.28.1" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - "@esbuild/win32-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/win32-arm64@npm:0.27.7" @@ -2909,13 +1690,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/win32-arm64@npm:0.28.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/win32-ia32@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/win32-ia32@npm:0.27.7" @@ -2923,13 +1697,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/win32-ia32@npm:0.28.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/win32-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/win32-x64@npm:0.27.7" @@ -2937,13 +1704,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/win32-x64@npm:0.28.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.7.0": version: 4.7.0 resolution: "@eslint-community/eslint-utils@npm:4.7.0" @@ -4281,18 +3041,6 @@ __metadata: languageName: node linkType: hard -"@openshift/dynamic-plugin-sdk-webpack@npm:^3.0.0": - version: 3.0.1 - resolution: "@openshift/dynamic-plugin-sdk-webpack@npm:3.0.1" - dependencies: - lodash: "npm:^4.17.21" - yup: "npm:^0.32.11" - peerDependencies: - webpack: ^5.75.0 - checksum: 10/1198260a0a58a6dd48f07c357889eaac5f3ef245571d37bb366d6f1ba28f730ccf138dc540a2bccdb710fd4f871d17d0bee24bf839fcebbe4519ec94411aa156 - languageName: node - linkType: hard - "@oxc-resolver/binding-darwin-arm64@npm:9.0.2": version: 9.0.2 resolution: "@oxc-resolver/binding-darwin-arm64@npm:9.0.2" @@ -4616,7 +3364,6 @@ __metadata: "@backstage/cli-node": "npm:0.3.3" "@backstage/config": "npm:~1.3.8" "@backstage/config-loader": "npm:~1.10.12" - "@backstage/core-plugin-api": "npm:~1.12.7" "@backstage/errors": "npm:~1.3.1" "@backstage/eslint-plugin": "npm:~0.3.1" "@backstage/release-manifests": "npm:~0.0.13" @@ -4624,13 +3371,10 @@ __metadata: "@backstage/types": "npm:~1.2.2" "@jest/globals": "npm:^30.0.0-beta.3" "@manypkg/get-packages": "npm:^1.1.3" - "@openshift/dynamic-plugin-sdk-webpack": "npm:^3.0.0" - "@pmmmwh/react-refresh-webpack-plugin": "npm:^0.6.0" "@spotify/eslint-config-base": "npm:15.0.0" "@spotify/eslint-config-react": "npm:15.0.0" "@spotify/eslint-config-typescript": "npm:15.0.0" "@spotify/prettier-config": "npm:15.0.0" - "@svgr/webpack": "npm:^6.5.1" "@types/fs-extra": "npm:^11.0.0" "@types/jest": "npm:^29.5.14" "@types/mock-fs": "npm:4.13.4" @@ -4645,55 +3389,35 @@ __metadata: "@yarnpkg/lockfile": "npm:^1.1.0" "@yarnpkg/parsers": "npm:^3.0.0-rc.4" axios: "npm:^1.9.0" - bfj: "npm:^9.0.2" chalk: "npm:^4.0.0" - chokidar: "npm:^3.3.1" codeowners: "npm:^5.1.1" commander: "npm:^9.1.0" - css-loader: "npm:^6.5.1" - esbuild: "npm:^0.28.1" - esbuild-loader: "npm:^4.0.0" eslint: "npm:8.57.1" eslint-config-prettier: "npm:^9.0.0" eslint-plugin-deprecation: "npm:3.0.0" eslint-plugin-import: "npm:2.31.0" eslint-plugin-jest: "npm:28.9.0" eslint-plugin-unused-imports: "npm:4.1.4" - eslint-webpack-plugin: "npm:^4.2.0" - fork-ts-checker-webpack-plugin: "npm:^9.0.0" fs-extra: "npm:^11.2.0" gitconfiglocal: "npm:2.1.0" handlebars: "npm:^4.7.7" - html-webpack-plugin: "npm:~5.6.3" is-native-module: "npm:^1.1.3" jest: "npm:^29.7.0" jest-environment-jsdom: "npm:^30.3.0" - lodash: "npm:^4.17.21" - mini-css-extract-plugin: "npm:^2.4.2" mock-fs: "npm:5.2.0" - node-stdlib-browser: "npm:^1.3.1" nodemon: "npm:3.1.3" npm-packlist: "npm:^5.0.0" ora: "npm:^5.3.0" - postcss: "npm:^8.2.13" prettier: "npm:3.3.3" - react-dev-utils: "npm:^12.0.0-next.60" - react-refresh: "npm:^0.18.0" recursive-readdir: "npm:^2.2.2" semver: "npm:^7.5.4" - style-loader: "npm:^3.3.1" - swc-loader: "npm:^0.2.3" tar: "npm:^7.5.7" ts-jest: "npm:^29.3.4" ts-node: "npm:10.9.2" type-fest: "npm:4.20.1" typescript: "npm:5.4.5" typescript-json-schema: "npm:^0.64.0" - webpack: "npm:~5.105.0" - webpack-dev-server: "npm:^5.0.0" yaml: "npm:^2.5.1" - yml-loader: "npm:^2.1.0" - yn: "npm:^4.0.0" peerDependencies: "@microsoft/api-extractor": ^7.21.2 ts-morph: "*" @@ -5304,13 +4028,6 @@ __metadata: languageName: node linkType: hard -"@standard-schema/spec@npm:^1.1.0": - version: 1.1.0 - resolution: "@standard-schema/spec@npm:1.1.0" - checksum: 10/a209615c9e8b2ea535d7db0a5f6aa0f962fd4ab73ee86a46c100fb78116964af1f55a27c1794d4801e534a196794223daa25ff5135021e03c7828aa3d95e1763 - languageName: node - linkType: hard - "@stoplight/better-ajv-errors@npm:1.0.3": version: 1.0.3 resolution: "@stoplight/better-ajv-errors@npm:1.0.3" @@ -5481,250 +4198,94 @@ __metadata: "@stoplight/spectral-runtime": "npm:^1.1.2" dependency-graph: "npm:0.11.0" tslib: "npm:^2.8.1" - checksum: 10/a010c8f415d4ec2668298f5cb6b1d8c83d59ea6da15f0576181a23f90c49a4bb5bcd0a22c06a46f38eec5da38d15721a6ae444f99a025efd4da7b69fa173e579 - languageName: node - linkType: hard - -"@stoplight/spectral-rulesets@npm:^1.18.0": - version: 1.22.0 - resolution: "@stoplight/spectral-rulesets@npm:1.22.0" - dependencies: - "@asyncapi/specs": "npm:^6.8.0" - "@stoplight/better-ajv-errors": "npm:1.0.3" - "@stoplight/json": "npm:^3.17.0" - "@stoplight/spectral-core": "npm:^1.19.4" - "@stoplight/spectral-formats": "npm:^1.8.1" - "@stoplight/spectral-functions": "npm:^1.9.1" - "@stoplight/spectral-runtime": "npm:^1.1.2" - "@stoplight/types": "npm:^13.6.0" - "@types/json-schema": "npm:^7.0.7" - ajv: "npm:^8.17.1" - ajv-formats: "npm:~2.1.1" - json-schema-traverse: "npm:^1.0.0" - leven: "npm:3.1.0" - lodash: "npm:~4.17.21" - tslib: "npm:^2.8.1" - checksum: 10/1e93a302436b62532324dadb5c0cd1f89606533a8fefb1437288b6dec6c28c350d41723718b978c0c4c806cffe9019a2b8b0df5f71f78349a23f98a2f847c036 - languageName: node - linkType: hard - -"@stoplight/spectral-runtime@npm:^1.1.2": - version: 1.1.4 - resolution: "@stoplight/spectral-runtime@npm:1.1.4" - dependencies: - "@stoplight/json": "npm:^3.20.1" - "@stoplight/path": "npm:^1.3.2" - "@stoplight/types": "npm:^13.6.0" - abort-controller: "npm:^3.0.0" - lodash: "npm:^4.17.21" - node-fetch: "npm:^2.7.0" - tslib: "npm:^2.8.1" - checksum: 10/77ffe7cf55d19046aaa3125f2395ab142a0c384f20245dcf5f7a100dcbdf8c726d95f25e5731746ce5ba34527ac64e62401d9e17f24156b708e9e464747e5ff5 - languageName: node - linkType: hard - -"@stoplight/types@npm:^12.3.0 || ^13.0.0, @stoplight/types@npm:^13.15.0, @stoplight/types@npm:^13.6.0": - version: 13.20.0 - resolution: "@stoplight/types@npm:13.20.0" - dependencies: - "@types/json-schema": "npm:^7.0.4" - utility-types: "npm:^3.10.0" - checksum: 10/4493d75cd7b37766e9e5255cbdee92a639b06d75ef8019a6cad6ab81348377423852e34966a46b270a3e23fc1a1365481d11885c64e98696a28224714d7d676d - languageName: node - linkType: hard - -"@stoplight/types@npm:^14.0.0, @stoplight/types@npm:^14.1.1": - version: 14.1.1 - resolution: "@stoplight/types@npm:14.1.1" - dependencies: - "@types/json-schema": "npm:^7.0.4" - utility-types: "npm:^3.10.0" - checksum: 10/1d053f4276872a1c31ef809ec13f57fcfcc3cac65cdd74ddc735c3b4397da6f8a5a8efd99d8c4f5d74cd8342dd28def304d69a4ef623e1f94bd0d5efe6e368be - languageName: node - linkType: hard - -"@stoplight/types@npm:~13.6.0": - version: 13.6.0 - resolution: "@stoplight/types@npm:13.6.0" - dependencies: - "@types/json-schema": "npm:^7.0.4" - utility-types: "npm:^3.10.0" - checksum: 10/63b04720784ad267607248aa6059dd7e4f4211deff491fc42b2665e30fb352abb15893c489a5d1f4b6c2675506c5cc420ee772eebd0310dae062eaedcb218cac - languageName: node - linkType: hard - -"@stoplight/yaml-ast-parser@npm:0.0.50": - version: 0.0.50 - resolution: "@stoplight/yaml-ast-parser@npm:0.0.50" - checksum: 10/f3683c515eec5f5abcd301fad9c37f290506b8feeffc72fdb269c733561a5f6a8fa6f30acc67b861fd350b3859eb6ab9993373ed838dbf157d11d72b3319cfe9 - languageName: node - linkType: hard - -"@stoplight/yaml@npm:~4.3.0": - version: 4.3.0 - resolution: "@stoplight/yaml@npm:4.3.0" - dependencies: - "@stoplight/ordered-object-literal": "npm:^1.0.5" - "@stoplight/types": "npm:^14.1.1" - "@stoplight/yaml-ast-parser": "npm:0.0.50" - tslib: "npm:^2.2.0" - checksum: 10/4a3eacfb5fb8936cb4b229f69542224e5905f71a6e2baeb70f73a67de6ce3b20178079a79d7744a437db901f67740dcdfd9b53dafb918ce75cbbb498ec548fd7 - languageName: node - linkType: hard - -"@svgr/babel-plugin-add-jsx-attribute@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/cab83832830a57735329ed68f67c03b57ca21fa037b0134847b0c5c0ef4beca89956d7dacfbf7b2a10fd901e7009e877512086db2ee918b8c69aee7742ae32c0 - languageName: node - linkType: hard - -"@svgr/babel-plugin-remove-jsx-attribute@npm:*": - version: 8.0.0 - resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/ff992893c6c4ac802713ba3a97c13be34e62e6d981c813af40daabcd676df68a72a61bd1e692bb1eda3587f1b1d700ea462222ae2153bb0f46886632d4f88d08 - languageName: node - linkType: hard - -"@svgr/babel-plugin-remove-jsx-empty-expression@npm:*": - version: 8.0.0 - resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/0fb691b63a21bac00da3aa2dccec50d0d5a5b347ff408d60803b84410d8af168f2656e4ba1ee1f24dab0ae4e4af77901f2928752bb0434c1f6788133ec599ec8 - languageName: node - linkType: hard - -"@svgr/babel-plugin-replace-jsx-attribute-value@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/b7d2125758e766e1ebd14b92216b800bdc976959bc696dbfa1e28682919147c1df4bb8b1b5fd037d7a83026e27e681fea3b8d3741af8d3cf4c9dfa3d412125df - languageName: node - linkType: hard - -"@svgr/babel-plugin-svg-dynamic-title@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/0fd42ebf127ae9163ef341e84972daa99bdcb9e6ed3f83aabd95ee173fddc43e40e02fa847fbc0a1058cf5549f72b7960a2c5e22c3e4ac18f7e3ac81277852ae - languageName: node - linkType: hard - -"@svgr/babel-plugin-svg-em-dimensions@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/c1550ee9f548526fa66fd171e3ffb5696bfc4e4cd108a631d39db492c7410dc10bba4eb5a190e9df824bf806130ccc586ae7d2e43c547e6a4f93bbb29a18f344 - languageName: node - linkType: hard - -"@svgr/babel-plugin-transform-react-native-svg@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/4c924af22b948b812629e80efb90ad1ec8faae26a232d8ca8a06b46b53e966a2c415a57806a3ff0ea806a622612e546422719b69ec6839717a7755dac19171d9 - languageName: node - linkType: hard - -"@svgr/babel-plugin-transform-svg-component@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-transform-svg-component@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/a4ddd3cf8b1a7a0542ff2c6a3eb7a75d6f79a86a62210306d94fb05e59699bb5da4ddde9ce98ef477b9cd528007fb728dc4d388d413b3aa25f48ed92b1f0a1c1 + checksum: 10/a010c8f415d4ec2668298f5cb6b1d8c83d59ea6da15f0576181a23f90c49a4bb5bcd0a22c06a46f38eec5da38d15721a6ae444f99a025efd4da7b69fa173e579 languageName: node linkType: hard -"@svgr/babel-preset@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-preset@npm:6.5.1" - dependencies: - "@svgr/babel-plugin-add-jsx-attribute": "npm:^6.5.1" - "@svgr/babel-plugin-remove-jsx-attribute": "npm:*" - "@svgr/babel-plugin-remove-jsx-empty-expression": "npm:*" - "@svgr/babel-plugin-replace-jsx-attribute-value": "npm:^6.5.1" - "@svgr/babel-plugin-svg-dynamic-title": "npm:^6.5.1" - "@svgr/babel-plugin-svg-em-dimensions": "npm:^6.5.1" - "@svgr/babel-plugin-transform-react-native-svg": "npm:^6.5.1" - "@svgr/babel-plugin-transform-svg-component": "npm:^6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/9f124be39a8e64f909162f925b3a63ddaa5a342a5e24fc0b7f7d9d4d7f7e3b916596c754fb557dc259928399cad5366a27cb231627a0d2dcc4b13ac521cf05af +"@stoplight/spectral-rulesets@npm:^1.18.0": + version: 1.22.0 + resolution: "@stoplight/spectral-rulesets@npm:1.22.0" + dependencies: + "@asyncapi/specs": "npm:^6.8.0" + "@stoplight/better-ajv-errors": "npm:1.0.3" + "@stoplight/json": "npm:^3.17.0" + "@stoplight/spectral-core": "npm:^1.19.4" + "@stoplight/spectral-formats": "npm:^1.8.1" + "@stoplight/spectral-functions": "npm:^1.9.1" + "@stoplight/spectral-runtime": "npm:^1.1.2" + "@stoplight/types": "npm:^13.6.0" + "@types/json-schema": "npm:^7.0.7" + ajv: "npm:^8.17.1" + ajv-formats: "npm:~2.1.1" + json-schema-traverse: "npm:^1.0.0" + leven: "npm:3.1.0" + lodash: "npm:~4.17.21" + tslib: "npm:^2.8.1" + checksum: 10/1e93a302436b62532324dadb5c0cd1f89606533a8fefb1437288b6dec6c28c350d41723718b978c0c4c806cffe9019a2b8b0df5f71f78349a23f98a2f847c036 languageName: node linkType: hard -"@svgr/core@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/core@npm:6.5.1" +"@stoplight/spectral-runtime@npm:^1.1.2": + version: 1.1.4 + resolution: "@stoplight/spectral-runtime@npm:1.1.4" dependencies: - "@babel/core": "npm:^7.19.6" - "@svgr/babel-preset": "npm:^6.5.1" - "@svgr/plugin-jsx": "npm:^6.5.1" - camelcase: "npm:^6.2.0" - cosmiconfig: "npm:^7.0.1" - checksum: 10/0aa3078eefb969d93fb5639c2d64c8868cf65134f0e36a1733dc595acc990081cbad62295e34b860150ce6baa21516d71410c5527579a1a0950cdc35a765873a + "@stoplight/json": "npm:^3.20.1" + "@stoplight/path": "npm:^1.3.2" + "@stoplight/types": "npm:^13.6.0" + abort-controller: "npm:^3.0.0" + lodash: "npm:^4.17.21" + node-fetch: "npm:^2.7.0" + tslib: "npm:^2.8.1" + checksum: 10/77ffe7cf55d19046aaa3125f2395ab142a0c384f20245dcf5f7a100dcbdf8c726d95f25e5731746ce5ba34527ac64e62401d9e17f24156b708e9e464747e5ff5 languageName: node linkType: hard -"@svgr/hast-util-to-babel-ast@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/hast-util-to-babel-ast@npm:6.5.1" +"@stoplight/types@npm:^12.3.0 || ^13.0.0, @stoplight/types@npm:^13.15.0, @stoplight/types@npm:^13.6.0": + version: 13.20.0 + resolution: "@stoplight/types@npm:13.20.0" dependencies: - "@babel/types": "npm:^7.20.0" - entities: "npm:^4.4.0" - checksum: 10/0410c6e5bf98fe31729ab1785642b915e7645e65c7ee5b2dd292a4603f8a1377402b95237c550b10dbdcc0bf084df1546ac7e98004d1fe5982cb8508147b47bb + "@types/json-schema": "npm:^7.0.4" + utility-types: "npm:^3.10.0" + checksum: 10/4493d75cd7b37766e9e5255cbdee92a639b06d75ef8019a6cad6ab81348377423852e34966a46b270a3e23fc1a1365481d11885c64e98696a28224714d7d676d languageName: node linkType: hard -"@svgr/plugin-jsx@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/plugin-jsx@npm:6.5.1" +"@stoplight/types@npm:^14.0.0, @stoplight/types@npm:^14.1.1": + version: 14.1.1 + resolution: "@stoplight/types@npm:14.1.1" dependencies: - "@babel/core": "npm:^7.19.6" - "@svgr/babel-preset": "npm:^6.5.1" - "@svgr/hast-util-to-babel-ast": "npm:^6.5.1" - svg-parser: "npm:^2.0.4" - peerDependencies: - "@svgr/core": ^6.0.0 - checksum: 10/42f22847a6bdf930514d7bedd3c5e1fd8d53eb3594779f9db16cb94c762425907c375cd8ec789114e100a4d38068aca6c7ab5efea4c612fba63f0630c44cc859 + "@types/json-schema": "npm:^7.0.4" + utility-types: "npm:^3.10.0" + checksum: 10/1d053f4276872a1c31ef809ec13f57fcfcc3cac65cdd74ddc735c3b4397da6f8a5a8efd99d8c4f5d74cd8342dd28def304d69a4ef623e1f94bd0d5efe6e368be languageName: node linkType: hard -"@svgr/plugin-svgo@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/plugin-svgo@npm:6.5.1" +"@stoplight/types@npm:~13.6.0": + version: 13.6.0 + resolution: "@stoplight/types@npm:13.6.0" dependencies: - cosmiconfig: "npm:^7.0.1" - deepmerge: "npm:^4.2.2" - svgo: "npm:^2.8.0" - peerDependencies: - "@svgr/core": "*" - checksum: 10/cd2833530ac0485221adc2146fd992ab20d79f4b12eebcd45fa859721dd779483158e11dfd9a534858fe468416b9412416e25cbe07ac7932c44ed5fa2021c72e + "@types/json-schema": "npm:^7.0.4" + utility-types: "npm:^3.10.0" + checksum: 10/63b04720784ad267607248aa6059dd7e4f4211deff491fc42b2665e30fb352abb15893c489a5d1f4b6c2675506c5cc420ee772eebd0310dae062eaedcb218cac languageName: node linkType: hard -"@svgr/webpack@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/webpack@npm:6.5.1" +"@stoplight/yaml-ast-parser@npm:0.0.50": + version: 0.0.50 + resolution: "@stoplight/yaml-ast-parser@npm:0.0.50" + checksum: 10/f3683c515eec5f5abcd301fad9c37f290506b8feeffc72fdb269c733561a5f6a8fa6f30acc67b861fd350b3859eb6ab9993373ed838dbf157d11d72b3319cfe9 + languageName: node + linkType: hard + +"@stoplight/yaml@npm:~4.3.0": + version: 4.3.0 + resolution: "@stoplight/yaml@npm:4.3.0" dependencies: - "@babel/core": "npm:^7.19.6" - "@babel/plugin-transform-react-constant-elements": "npm:^7.18.12" - "@babel/preset-env": "npm:^7.19.4" - "@babel/preset-react": "npm:^7.18.6" - "@babel/preset-typescript": "npm:^7.18.6" - "@svgr/core": "npm:^6.5.1" - "@svgr/plugin-jsx": "npm:^6.5.1" - "@svgr/plugin-svgo": "npm:^6.5.1" - checksum: 10/2748acc94839a2da09d73fe23bd9df85e08d52d823425591c960e8a25b83861ca2f49dbb1d66ea318da8160f16ce6248c8854229bd6316565517356c74c3440f + "@stoplight/ordered-object-literal": "npm:^1.0.5" + "@stoplight/types": "npm:^14.1.1" + "@stoplight/yaml-ast-parser": "npm:0.0.50" + tslib: "npm:^2.2.0" + checksum: 10/4a3eacfb5fb8936cb4b229f69542224e5905f71a6e2baeb70f73a67de6ce3b20178079a79d7744a437db901f67740dcdfd9b53dafb918ce75cbbb498ec548fd7 languageName: node linkType: hard @@ -6245,13 +4806,6 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:^4.14.175": - version: 4.17.17 - resolution: "@types/lodash@npm:4.17.17" - checksum: 10/496459a3cb1a0733bb60532de3899ad6297717af0b9b26ad6821154b2005fec86f29ccd47a2e6f4da4a8c7c818bb8ae73901144e8057ea86b7b02a3d7bb9d13f - languageName: node - linkType: hard - "@types/luxon@npm:^3.0.0": version: 3.6.2 resolution: "@types/luxon@npm:3.6.2" @@ -7717,42 +6271,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.13 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.13" - dependencies: - "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.4" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/e238534f345edb26471438cdef8f9182892c4a857fc1cd74d8ecb3072d5126232e299d3850027cecbcb599e721cef835b9e63aba35c2db41733635d39b76c1d8 - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs3@npm:^0.11.0": - version: 0.11.1 - resolution: "babel-plugin-polyfill-corejs3@npm:0.11.1" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.3" - core-js-compat: "npm:^3.40.0" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/19a2978ee3462cc3b98e7d36e6537bf9fb1fb61f42fd96cb41e9313f2ac6f2c62380d94064366431eff537f342184720fe9bce73eb65fd57c5311d15e8648f62 - languageName: node - linkType: hard - -"babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.4 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.4" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.4" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/f4d4a803834ffa72713579d696586d8cc654c0025cbd5ec775fc5d37faa00381dcb80e5b97d4b16059443352653585596d87848b5590b1d8670c235408e73fb3 - languageName: node - linkType: hard - "babel-preset-current-node-syntax@npm:^1.0.0, babel-preset-current-node-syntax@npm:^1.1.0": version: 1.1.0 resolution: "babel-preset-current-node-syntax@npm:1.1.0" @@ -8056,7 +6574,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.4, browserslist@npm:^4.24.0, browserslist@npm:^4.24.4, browserslist@npm:^4.28.1": +"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.4, browserslist@npm:^4.24.0, browserslist@npm:^4.28.1": version: 4.28.1 resolution: "browserslist@npm:4.28.1" dependencies: @@ -8851,15 +7369,6 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.40.0": - version: 3.42.0 - resolution: "core-js-compat@npm:3.42.0" - dependencies: - browserslist: "npm:^4.24.4" - checksum: 10/2052c73e500e95420d948a0595f4055e40ca6a208cc15c7981b7f202efa851bfae3de59a13009dc367cc5fbaeb8ff84a64c7c0bfc37de4b3bd2cf6b0e14290bd - languageName: node - linkType: hard - "core-js-pure@npm:^3.23.3": version: 3.42.0 resolution: "core-js-pure@npm:3.42.0" @@ -8887,19 +7396,6 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^7.0.1": - version: 7.1.0 - resolution: "cosmiconfig@npm:7.1.0" - dependencies: - "@types/parse-json": "npm:^4.0.0" - import-fresh: "npm:^3.2.1" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - yaml: "npm:^1.10.0" - checksum: 10/03600bb3870c80ed151b7b706b99a1f6d78df8f4bdad9c95485072ea13358ef294b13dd99f9e7bf4cc0b43bcd3599d40df7e648750d21c2f6817ca2cd687e071 - languageName: node - linkType: hard - "cosmiconfig@npm:^8.2.0": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" @@ -9791,13 +8287,6 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.4.0": - version: 4.5.0 - resolution: "entities@npm:4.5.0" - checksum: 10/ede2a35c9bce1aeccd055a1b445d41c75a14a2bb1cd22e242f20cf04d236cdcd7f9c859eb83f76885327bfae0c25bf03303665ee1ce3d47c5927b98b0e3e3d48 - languageName: node - linkType: hard - "entities@npm:^6.0.0": version: 6.0.1 resolution: "entities@npm:6.0.1" @@ -10122,95 +8611,6 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.28.1": - version: 0.28.1 - resolution: "esbuild@npm:0.28.1" - dependencies: - "@esbuild/aix-ppc64": "npm:0.28.1" - "@esbuild/android-arm": "npm:0.28.1" - "@esbuild/android-arm64": "npm:0.28.1" - "@esbuild/android-x64": "npm:0.28.1" - "@esbuild/darwin-arm64": "npm:0.28.1" - "@esbuild/darwin-x64": "npm:0.28.1" - "@esbuild/freebsd-arm64": "npm:0.28.1" - "@esbuild/freebsd-x64": "npm:0.28.1" - "@esbuild/linux-arm": "npm:0.28.1" - "@esbuild/linux-arm64": "npm:0.28.1" - "@esbuild/linux-ia32": "npm:0.28.1" - "@esbuild/linux-loong64": "npm:0.28.1" - "@esbuild/linux-mips64el": "npm:0.28.1" - "@esbuild/linux-ppc64": "npm:0.28.1" - "@esbuild/linux-riscv64": "npm:0.28.1" - "@esbuild/linux-s390x": "npm:0.28.1" - "@esbuild/linux-x64": "npm:0.28.1" - "@esbuild/netbsd-arm64": "npm:0.28.1" - "@esbuild/netbsd-x64": "npm:0.28.1" - "@esbuild/openbsd-arm64": "npm:0.28.1" - "@esbuild/openbsd-x64": "npm:0.28.1" - "@esbuild/openharmony-arm64": "npm:0.28.1" - "@esbuild/sunos-x64": "npm:0.28.1" - "@esbuild/win32-arm64": "npm:0.28.1" - "@esbuild/win32-ia32": "npm:0.28.1" - "@esbuild/win32-x64": "npm:0.28.1" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-arm64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/openharmony-arm64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10/aaa4a922644afffac45e735c99caf343f881e2d36abcc6b6fb53c230bd69940504a5bb6b0041bdd1a690e748ebc681d3308a7d178987c523d74c63c2c280bac8 - languageName: node - linkType: hard - "escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" @@ -11576,13 +9976,6 @@ __metadata: languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10/9f054fa38ff8de8fa356502eb9d2dae0c928217b8b5c8de1f09f5c9b6c8a96d8b9bd3afc49acbcd384a98a81fea713c859e1b09e214c60509517bb8fc2bc13c2 - languageName: node - linkType: hard - "globals@npm:^13.19.0": version: 13.24.0 resolution: "globals@npm:13.24.0" @@ -11798,15 +10191,6 @@ __metadata: languageName: node linkType: hard -"history@npm:^5.0.0": - version: 5.3.0 - resolution: "history@npm:5.3.0" - dependencies: - "@babel/runtime": "npm:^7.7.6" - checksum: 10/52ba685b842ca6438ff11ef459951eb13d413ae715866a8dc5f7c3b1ea0cdeb8db6aabf7254551b85f56abc205e6e2d7e1d5afb36b711b401cdaff4f2cf187e9 - languageName: node - linkType: hard - "hmac-drbg@npm:^1.0.1": version: 1.0.1 resolution: "hmac-drbg@npm:1.0.1" @@ -11877,7 +10261,7 @@ __metadata: languageName: node linkType: hard -"html-webpack-plugin@npm:^5.6.3, html-webpack-plugin@npm:~5.6.3": +"html-webpack-plugin@npm:^5.6.3": version: 5.6.3 resolution: "html-webpack-plugin@npm:5.6.3" dependencies: @@ -13631,15 +12015,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:~3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" - bin: - jsesc: bin/jsesc - checksum: 10/8e5a7de6b70a8bd71f9cb0b5a7ade6a73ae6ab55e697c74cc997cede97417a3a65ed86c36f7dd6125fe49766e8386c845023d9e213916ca92c9dfdd56e2babf3 - languageName: node - linkType: hard - "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -14069,13 +12444,6 @@ __metadata: languageName: node linkType: hard -"lodash-es@npm:^4.17.21": - version: 4.18.1 - resolution: "lodash-es@npm:4.18.1" - checksum: 10/8bfad225ef09ef42b04283cdaf7830efcc2ba29ae41b56501c74422155ee1ccaa1f0f6e8319def3451a1fe54dec501c8e4bee622bae2b2d98ac993731e0a5cce - languageName: node - linkType: hard - "lodash.camelcase@npm:^4.3.0": version: 4.3.0 resolution: "lodash.camelcase@npm:4.3.0" @@ -14083,13 +12451,6 @@ __metadata: languageName: node linkType: hard -"lodash.debounce@npm:^4.0.8": - version: 4.0.8 - resolution: "lodash.debounce@npm:4.0.8" - checksum: 10/cd0b2819786e6e80cb9f5cda26b1a8fc073daaf04e48d4cb462fa4663ec9adb3a5387aa22d7129e48eed1afa05b482e2a6b79bfc99b86886364449500cbb00fd - languageName: node - linkType: hard - "lodash.flattendeep@npm:^4.0.0": version: 4.4.0 resolution: "lodash.flattendeep@npm:4.4.0" @@ -14752,13 +13113,6 @@ __metadata: languageName: node linkType: hard -"nanoclone@npm:^0.2.1": - version: 0.2.1 - resolution: "nanoclone@npm:0.2.1" - checksum: 10/ecb2907394c9c82bc878640b6887b69ef766fe87d1eac9831baa2f48a28b7adba082ab5d578030d460ec50800303491839bebabc51623c9c357590c5a1d26a4c - languageName: node - linkType: hard - "nanoid@npm:^3.3.17": version: 3.3.18 resolution: "nanoid@npm:3.3.18" @@ -16317,7 +14671,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.1.0, postcss@npm:^8.2.13, postcss@npm:^8.4.33": +"postcss@npm:^8.1.0, postcss@npm:^8.4.33": version: 8.5.26 resolution: "postcss@npm:8.5.26" dependencies: @@ -16479,13 +14833,6 @@ __metadata: languageName: node linkType: hard -"property-expr@npm:^2.0.4": - version: 2.0.6 - resolution: "property-expr@npm:2.0.6" - checksum: 10/89977f4bb230736c1876f460dd7ca9328034502fd92e738deb40516d16564b850c0bbc4e052c3df88b5b8cd58e51c93b46a94bea049a3f23f4a022c038864cab - languageName: node - linkType: hard - "proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" @@ -16845,22 +15192,6 @@ __metadata: languageName: node linkType: hard -"regenerate-unicode-properties@npm:^10.2.0": - version: 10.2.0 - resolution: "regenerate-unicode-properties@npm:10.2.0" - dependencies: - regenerate: "npm:^1.4.2" - checksum: 10/9150eae6fe04a8c4f2ff06077396a86a98e224c8afad8344b1b656448e89e84edcd527e4b03aa5476774129eb6ad328ed684f9c1459794a935ec0cc17ce14329 - languageName: node - linkType: hard - -"regenerate@npm:^1.4.2": - version: 1.4.2 - resolution: "regenerate@npm:1.4.2" - checksum: 10/dc6c95ae4b3ba6adbd7687cafac260eee4640318c7a95239d5ce847d9b9263979758389e862fe9c93d633b5792ea4ada5708df75885dc5aa05a309fa18140a87 - languageName: node - linkType: hard - "regexp.prototype.flags@npm:^1.5.3": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" @@ -16875,38 +15206,6 @@ __metadata: languageName: node linkType: hard -"regexpu-core@npm:^6.2.0": - version: 6.2.0 - resolution: "regexpu-core@npm:6.2.0" - dependencies: - regenerate: "npm:^1.4.2" - regenerate-unicode-properties: "npm:^10.2.0" - regjsgen: "npm:^0.8.0" - regjsparser: "npm:^0.12.0" - unicode-match-property-ecmascript: "npm:^2.0.0" - unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 10/4d054ffcd98ca4f6ca7bf0df6598ed5e4a124264602553308add41d4fa714a0c5bcfb5bc868ac91f7060a9c09889cc21d3180a3a14c5f9c5838442806129ced3 - languageName: node - linkType: hard - -"regjsgen@npm:^0.8.0": - version: 0.8.0 - resolution: "regjsgen@npm:0.8.0" - checksum: 10/b930f03347e4123c917d7b40436b4f87f625b8dd3e705b447ddd44804e4616c3addb7453f0902d6e914ab0446c30e816e445089bb641a4714237fe8141a0ef9d - languageName: node - linkType: hard - -"regjsparser@npm:^0.12.0": - version: 0.12.0 - resolution: "regjsparser@npm:0.12.0" - dependencies: - jsesc: "npm:~3.0.2" - bin: - regjsparser: bin/parser - checksum: 10/c2d6506b3308679de5223a8916984198e0493649a67b477c66bdb875357e3785abbf3bedf7c5c2cf8967d3b3a7bdf08b7cbd39e65a70f9e1ffad584aecf5f06a - languageName: node - linkType: hard - "relateurl@npm:^0.2.7": version: 0.2.7 resolution: "relateurl@npm:0.2.7" @@ -16998,7 +15297,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.14.2, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:~1.22.1, resolve@npm:~1.22.2": +"resolve@npm:^1.1.7, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:~1.22.1, resolve@npm:~1.22.2": version: 1.22.11 resolution: "resolve@npm:1.22.11" dependencies: @@ -17024,7 +15323,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin": version: 1.22.11 resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=9bd1a5" dependencies: @@ -18314,14 +16613,7 @@ __metadata: languageName: node linkType: hard -"svg-parser@npm:^2.0.4": - version: 2.0.4 - resolution: "svg-parser@npm:2.0.4" - checksum: 10/ec196da6ea21481868ab26911970e35488361c39ead1c6cdd977ba16c885c21a91ddcbfd113bfb01f79a822e2a751ef85b2f7f95e2cb9245558ebce12c34af1f - languageName: node - linkType: hard - -"svgo@npm:^2.7.0, svgo@npm:^2.8.0": +"svgo@npm:^2.7.0": version: 2.8.3 resolution: "svgo@npm:2.8.3" dependencies: @@ -18623,13 +16915,6 @@ __metadata: languageName: node linkType: hard -"toposort@npm:^2.0.2": - version: 2.0.2 - resolution: "toposort@npm:2.0.2" - checksum: 10/6f128353e4ed9739e49a28fb756b0a00f3752b29fc9b862ff781446598ee3b486cd229697feebc4eabd916eac5de219f3dae450c585bf13673f6b133a7226e06 - languageName: node - linkType: hard - "tosource@npm:^2.0.0-alpha.3": version: 2.0.0-alpha.3 resolution: "tosource@npm:2.0.0-alpha.3" @@ -19200,13 +17485,6 @@ __metadata: languageName: node linkType: hard -"unicode-canonical-property-names-ecmascript@npm:^2.0.0": - version: 2.0.1 - resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1" - checksum: 10/3c3dabdb1d22aef4904399f9e810d0b71c0b12b3815169d96fac97e56d5642840c6071cf709adcace2252bc6bb80242396c2ec74b37224eb015c5f7aca40bad7 - languageName: node - linkType: hard - "unicode-emoji-modifier-base@npm:^1.0.0": version: 1.0.0 resolution: "unicode-emoji-modifier-base@npm:1.0.0" @@ -19214,30 +17492,6 @@ __metadata: languageName: node linkType: hard -"unicode-match-property-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-match-property-ecmascript@npm:2.0.0" - dependencies: - unicode-canonical-property-names-ecmascript: "npm:^2.0.0" - unicode-property-aliases-ecmascript: "npm:^2.0.0" - checksum: 10/1f34a7434a23df4885b5890ac36c5b2161a809887000be560f56ad4b11126d433c0c1c39baf1016bdabed4ec54829a6190ee37aa24919aa116dc1a5a8a62965a - languageName: node - linkType: hard - -"unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.2.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.2.0" - checksum: 10/9fd53c657aefe5d3cb8208931b4c34fbdb30bb5aa9a6c6bf744e2f3036f00b8889eeaf30cb55a873b76b6ee8b5801ea770e1c49b3352141309f58f0ebb3011d8 - languageName: node - linkType: hard - -"unicode-property-aliases-ecmascript@npm:^2.0.0": - version: 2.1.0 - resolution: "unicode-property-aliases-ecmascript@npm:2.1.0" - checksum: 10/243524431893649b62cc674d877bd64ef292d6071dd2fd01ab4d5ad26efbc104ffcd064f93f8a06b7e4ec54c172bf03f6417921a0d8c3a9994161fe1f88f815b - languageName: node - linkType: hard - "unique-filename@npm:^4.0.0": version: 4.0.0 resolution: "unique-filename@npm:4.0.0" @@ -20013,7 +18267,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^1.10.0, yaml@npm:^1.10.2, yaml@npm:^1.7.2": +"yaml@npm:^1.10.2, yaml@npm:^1.7.2": version: 1.10.3 resolution: "yaml@npm:1.10.3" checksum: 10/e2ef2feb92c708138f016c69777a0f1e45f6d3c5e7cbcda30807a98a37eda2e008bd4fa57352b043c65245a4c799d0c99d1f9b3425de40e70929e26d2ea38215 @@ -20104,21 +18358,6 @@ __metadata: languageName: node linkType: hard -"yup@npm:^0.32.11": - version: 0.32.11 - resolution: "yup@npm:0.32.11" - dependencies: - "@babel/runtime": "npm:^7.15.4" - "@types/lodash": "npm:^4.14.175" - lodash: "npm:^4.17.21" - lodash-es: "npm:^4.17.21" - nanoclone: "npm:^0.2.1" - property-expr: "npm:^2.0.4" - toposort: "npm:^2.0.2" - checksum: 10/a1f529c51d54b2f2f9a326bf65eb6cb6ceaa16f1a5d5d1f631d15f5db3b48c0f3e4852028384a628f2305d9a8f64080d10029fe4c6b19116efd528fe00afed6e - languageName: node - linkType: hard - "zod-to-json-schema@npm:^3.25.1": version: 3.25.2 resolution: "zod-to-json-schema@npm:3.25.2" @@ -20153,7 +18392,7 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.25.76 || ^4.0.0, zod@npm:^4.0.0": +"zod@npm:^3.25.76 || ^4.0.0": version: 4.4.3 resolution: "zod@npm:4.4.3" checksum: 10/804b9a42aa8f35f2b3c5a8dff906291cb749115f83ee2afe3576d70b5b5c53c965365c7f4967690647a9c54af9838ff232a85ff9577a0a36c44b68bc6cdefe36