From f40fdb41412ae810ed1e8d7f07b7abee7fc635ad Mon Sep 17 00:00:00 2001 From: Hope Hadfield Date: Tue, 8 Sep 2026 16:35:33 -0400 Subject: [PATCH 1/7] feat: remove scalprum frontend support Make frontend plugin export use Backstage standard module federation exclusively and remove the legacy Scalprum bundler, commands, options, and dependencies. Clean legacy artifacts from packaged output, preserve NFS feature metadata when available, and update end-to-end expectations for NFS remotes. Assisted-by: gpt-5.6-luna --- .../community-plugins-build-package.test.ts | 13 +- e2e-tests/rhdh-plugins-build-package.test.ts | 13 +- package.json | 28 +- src/commands/build/buildFrontend.ts | 51 - src/commands/build/command.ts | 51 - src/commands/build/index.ts | 17 - src/commands/export-dynamic-plugin/command.ts | 12 +- .../export-dynamic-plugin/frontend.ts | 168 +- src/commands/index.ts | 16 - src/commands/start/command.ts | 53 - src/commands/start/index.ts | 17 - src/commands/start/startFrontend.ts | 36 - src/lib/builder/buildScalprumPlugin.ts | 23 - .../LinkedPackageResolvePlugin.test.ts | 206 -- src/lib/bundler/LinkedPackageResolvePlugin.ts | 84 - src/lib/bundler/bundle.ts | 168 -- src/lib/bundler/bundlePlugin.ts | 133 - src/lib/bundler/config.ts | 257 -- src/lib/bundler/index.ts | 18 - src/lib/bundler/optimization.ts | 80 - src/lib/bundler/packageDetection.ts | 139 - src/lib/bundler/paths.ts | 77 - src/lib/bundler/scalprumConfig.ts | 209 -- src/lib/bundler/server.ts | 236 -- src/lib/bundler/transforms.ts | 211 -- src/lib/bundler/types.ts | 64 - src/lib/config.ts | 141 -- src/lib/role.test.ts | 58 - src/lib/role.ts | 37 - src/lib/svgrTemplate.ts | 42 - src/lib/urls.test.ts | 34 - src/lib/urls.ts | 25 - src/types.d.ts | 259 -- yarn.lock | 2239 ++--------------- 34 files changed, 296 insertions(+), 4919 deletions(-) delete mode 100644 src/commands/build/buildFrontend.ts delete mode 100644 src/commands/build/command.ts delete mode 100644 src/commands/build/index.ts delete mode 100644 src/commands/start/command.ts delete mode 100644 src/commands/start/index.ts delete mode 100644 src/commands/start/startFrontend.ts delete mode 100644 src/lib/builder/buildScalprumPlugin.ts delete mode 100644 src/lib/bundler/LinkedPackageResolvePlugin.test.ts delete mode 100644 src/lib/bundler/LinkedPackageResolvePlugin.ts delete mode 100644 src/lib/bundler/bundle.ts delete mode 100644 src/lib/bundler/bundlePlugin.ts delete mode 100644 src/lib/bundler/config.ts delete mode 100644 src/lib/bundler/index.ts delete mode 100644 src/lib/bundler/optimization.ts delete mode 100644 src/lib/bundler/packageDetection.ts delete mode 100644 src/lib/bundler/paths.ts delete mode 100644 src/lib/bundler/scalprumConfig.ts delete mode 100644 src/lib/bundler/server.ts delete mode 100644 src/lib/bundler/transforms.ts delete mode 100644 src/lib/bundler/types.ts delete mode 100644 src/lib/config.ts delete mode 100644 src/lib/role.test.ts delete mode 100644 src/lib/role.ts delete mode 100644 src/lib/svgrTemplate.ts delete mode 100644 src/lib/urls.test.ts delete mode 100644 src/lib/urls.ts delete mode 100644 src/types.d.ts diff --git a/e2e-tests/community-plugins-build-package.test.ts b/e2e-tests/community-plugins-build-package.test.ts index 220b14c..cf3fec3 100644 --- a/e2e-tests/community-plugins-build-package.test.ts +++ b/e2e-tests/community-plugins-build-package.test.ts @@ -110,12 +110,15 @@ 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); + // eslint-disable-next-line jest/no-conditional-expect + expect( + fs.existsSync( + path.join(getFullPluginPath(), 'dist-dynamic/dist-scalprum'), + ), + ).toEqual(false); const distDynamicPkg = JSON.parse( fs.readFileSync( @@ -125,6 +128,8 @@ describe('export and package backstage-community plugin', () => { ); // eslint-disable-next-line jest/no-conditional-expect expect(distDynamicPkg.backstage?.features).toEqual(expectedFeatures); + // eslint-disable-next-line jest/no-conditional-expect + expect(distDynamicPkg).not.toHaveProperty('scalprum'); } }); diff --git a/e2e-tests/rhdh-plugins-build-package.test.ts b/e2e-tests/rhdh-plugins-build-package.test.ts index 2b95246..60b0398 100644 --- a/e2e-tests/rhdh-plugins-build-package.test.ts +++ b/e2e-tests/rhdh-plugins-build-package.test.ts @@ -110,12 +110,15 @@ 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); + // eslint-disable-next-line jest/no-conditional-expect + expect( + fs.existsSync( + path.join(getFullPluginPath(), 'dist-dynamic/dist-scalprum'), + ), + ).toEqual(false); const distDynamicPkg = JSON.parse( fs.readFileSync( @@ -125,6 +128,8 @@ describe('export and package rhdh-plugins scorecard workspace plugin', () => { ); // eslint-disable-next-line jest/no-conditional-expect expect(distDynamicPkg.backstage?.features).toEqual(expectedFeatures); + // eslint-disable-next-line jest/no-conditional-expect + expect(distDynamicPkg).not.toHaveProperty('scalprum'); } }); diff --git a/package.json b/package.json index 53c3dbd..f53e096 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.4", + "version": "2.1.0", "publishConfig": { "access": "public" }, @@ -50,51 +50,27 @@ "@backstage/types": "~1.2.2", "@changesets/cli": "^2.29.4", "@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.25.0", - "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 74a9103..b20d7bf 100644 --- a/src/commands/export-dynamic-plugin/command.ts +++ b/src/commands/export-dynamic-plugin/command.ts @@ -48,18 +48,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..a654a0a 100644 --- a/src/commands/export-dynamic-plugin/frontend.ts +++ b/src/commands/export-dynamic-plugin/frontend.ts @@ -23,8 +23,8 @@ import { OptionValues } from 'commander'; import fs from 'fs-extra'; import path from 'path'; +import recursive from 'recursive-readdir'; -import { buildScalprumPlugin } from '../../lib/builder/buildScalprumPlugin'; import { productionPack } from '../../lib/packager/productionPack'; import { paths } from '../../lib/paths'; import { Task } from '../../lib/tasks'; @@ -39,48 +39,56 @@ function isTruthyCiEnv(value: string | undefined): boolean { return normalized === 'true' || normalized === '1' || normalized === 'yes'; } +function isScalprumFilesEntry(file: string): boolean { + const normalized = file.replaceAll('\\', '/'); + const normalizedPath = normalized.startsWith('!') + ? normalized.slice(1) + : normalized; + const suffix = normalizedPath.slice('dist-scalprum'.length); + + return ( + normalizedPath === 'dist-scalprum' || + suffix.startsWith('/') || + suffix.startsWith('*') || + suffix.startsWith('?') || + suffix.startsWith('[') + ); +} + export async function frontend( _: PackageRoleInfo, 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) { - throw new Error( - 'You should use at least one of the 2 options: --generate-scalprum-assets or --generate-module-federation-assets.', - ); + if (opts.clean) { + await fs.remove(path.join(paths.targetDir, 'dist')); } - if (opts.generateModuleFederationAssets) { - 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); + 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; } } } @@ -110,22 +118,19 @@ export async function frontend( targetDir: target, }); + // Remove stale Scalprum output that may have been included by npm-packlist + // before the derived package manifest is customized below. + await fs.remove(path.join(target, 'dist-scalprum')); + Task.log( `Customizing main package in ${chalk.cyan( 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); @@ -143,68 +148,27 @@ export async function frontend( // and obviously this should not trigger the backstage pre-pack or post-pack actions // which are related to the packaging of the original static package. scripts: {}, - files, + files: Array.isArray(files) + ? files.filter((file: string) => !isScalprumFilesEntry(file)) + : files, }, rootResolutions, - after: detectedFeatures - ? pkg => { - pkg.backstage = pkg.backstage ?? {}; - pkg.backstage.features = detectedFeatures; - } - : undefined, + after: pkg => { + delete (pkg as unknown as Record).scalprum; + if (detectedFeatures) { + pkg.backstage = pkg.backstage ?? {}; + pkg.backstage.features = detectedFeatures; + } + }, })(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, - )}`, + const legacyScalprumFiles = (await recursive(target)).filter(file => + path.relative(target, file).split(path.sep).includes('dist-scalprum'), + ); + if (legacyScalprumFiles.length > 0) { + throw new Error( + `The exported package contains legacy Scalprum files: ${legacyScalprumFiles.join(', ')}`, ); - - 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; - } - 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, - }); } return target; diff --git a/src/commands/index.ts b/src/commands/index.ts index 86aeb74..aab5432 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -72,27 +72,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 d63a9a0..9a4267a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -88,7 +88,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.26.2, @babel/code-frame@npm:^7.27.1, @babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.26.2, @babel/code-frame@npm:^7.27.1, @babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.8.3": version: 7.29.0 resolution: "@babel/code-frame@npm:7.29.0" dependencies: @@ -110,13 +110,6 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/compat-data@npm:7.27.2" - checksum: 10/eaa9f8aaeb9475779f4411fa397f712a6441b650d4e0b40c5535c954c891cd35c0363004db42902192aa8224532ac31ce06890478b060995286fe4fadd54e542 - languageName: node - linkType: hard - "@babel/compat-data@npm:^7.29.7": version: 7.29.7 resolution: "@babel/compat-data@npm:7.29.7" @@ -124,7 +117,7 @@ __metadata: 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: @@ -147,7 +140,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.27.5, @babel/generator@npm:^7.29.0, @babel/generator@npm:^7.7.2": +"@babel/generator@npm:^7.27.5, @babel/generator@npm:^7.7.2": version: 7.29.1 resolution: "@babel/generator@npm:7.29.1" dependencies: @@ -173,28 +166,6 @@ __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": - version: 7.27.2 - resolution: "@babel/helper-compilation-targets@npm:7.27.2" - dependencies: - "@babel/compat-data": "npm:^7.27.2" - "@babel/helper-validator-option": "npm:^7.27.1" - browserslist: "npm:^4.24.0" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10/bd53c30a7477049db04b655d11f4c3500aea3bcbc2497cf02161de2ecf994fec7c098aabbcebe210ffabc2ecbdb1e3ffad23fb4d3f18723b814f423ea1749fe8 - languageName: node - linkType: hard - "@babel/helper-compilation-targets@npm:^7.29.7": version: 7.29.7 resolution: "@babel/helper-compilation-targets@npm:7.29.7" @@ -208,58 +179,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.28.0": - version: 7.28.0 - resolution: "@babel/helper-globals@npm:7.28.0" - checksum: 10/91445f7edfde9b65dcac47f4f858f68dc1661bf73332060ab67ad7cc7b313421099a2bfc4bda30c3db3842cfa1e86fffbb0d7b2c5205a177d91b22c8d7d9cb47 - languageName: node - linkType: hard - "@babel/helper-globals@npm:^7.29.7": version: 7.29.7 resolution: "@babel/helper-globals@npm:7.29.7" @@ -267,26 +186,6 @@ __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.28.6": - version: 7.28.6 - resolution: "@babel/helper-module-imports@npm:7.28.6" - dependencies: - "@babel/traverse": "npm:^7.28.6" - "@babel/types": "npm:^7.28.6" - checksum: 10/64b1380d74425566a3c288074d7ce4dea56d775d2d3325a3d4a6df1dca702916c1d268133b6f385de9ba5b822b3c6e2af5d3b11ac88e5453d5698d77264f0ec0 - languageName: node - linkType: hard - "@babel/helper-module-imports@npm:^7.29.7": version: 7.29.7 resolution: "@babel/helper-module-imports@npm:7.29.7" @@ -297,19 +196,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-module-transforms@npm:7.28.6" - dependencies: - "@babel/helper-module-imports": "npm:^7.28.6" - "@babel/helper-validator-identifier": "npm:^7.28.5" - "@babel/traverse": "npm:^7.28.6" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/2e421c7db743249819ee51e83054952709dc2e197c7d5d415b4bdddc718580195704bfcdf38544b3f674efc2eccd4d29a65d38678fc827ed3934a7690984cd8b - languageName: node - linkType: hard - "@babel/helper-module-transforms@npm:^7.29.7": version: 7.29.7 resolution: "@babel/helper-module-transforms@npm:7.29.7" @@ -323,58 +209,13 @@ __metadata: 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": +"@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/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.27.1": version: 7.27.1 resolution: "@babel/helper-string-parser@npm:7.27.1" @@ -385,1174 +226,269 @@ __metadata: "@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": - version: 7.28.5 - resolution: "@babel/helper-validator-identifier@npm:7.28.5" - checksum: 10/8e5d9b0133702cfacc7f368bf792f0f8ac0483794877c6dca5fcb73810ee138e27527701826fb58a40a004f3a5ec0a2f3c3dd5e326d262530b119918f3132ba7 - languageName: node - linkType: hard - -"@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": - version: 7.27.1 - resolution: "@babel/helper-validator-option@npm:7.27.1" - checksum: 10/db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 - languageName: node - linkType: hard - -"@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.28.6, @babel/parser@npm:^7.29.0": - version: 7.29.3 - resolution: "@babel/parser@npm:7.29.3" - dependencies: - "@babel/types": "npm:^7.29.0" - bin: - parser: ./bin/babel-parser.js - checksum: 10/10e8f34e0fdaa495b9db8be71f4eb29b16d8a57e0818c1bb1c4084015b0383803fd77812ed41597760cbf3d9ab3ae9f4af54f39ff5e5d8e081ba43593232f0ca - languageName: node - linkType: hard - -"@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 - 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" - 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/c76f8f6056946466116e67eb9d8014a2d748ade2062636ab82045c1dac9c233aff10e597777bc5af6f26428beb845ceb41b95007abef7d0484da95789da56662 + checksum: 10/4d8ef0ef7105f3d9fe4361137c8f42e5b4c7a52b5380b962762f2a528a1ba89064e2c6236090716ce34b63707b886ae0ebf36b2c2fcc2851f27e652febfc3648 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-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 10/8e5d9b0133702cfacc7f368bf792f0f8ac0483794877c6dca5fcb73810ee138e27527701826fb58a40a004f3a5ec0a2f3c3dd5e326d262530b119918f3132ba7 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-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-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-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-display-name@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-display-name@npm:7.27.1" +"@babel/helpers@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helpers@npm:7.29.7" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/5c794e91da4f27b39314b5354bbede049074c04646949ad3a4c5788b9a1a6fa649d2f0fa95587209219443c97127e0cfa41ab56a3eaf68e91a319948518f8357 + "@babel/template": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10/b4d1ef12c19e896585c009ba29677839097ff04f8b11a2430d335c3fb6bd667b4f9e96a3b185a083fdde6b1137eabbbf2600c32425cb69cefc81d81d5cfe425d 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/highlight@npm:^7.0.0": + version: 7.25.9 + resolution: "@babel/highlight@npm:7.25.9" dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/b88865d5b8c018992f2332da939faa15c4d4a864c9435a5937beaff3fe43781432cc42e0a5d5631098e0bd4066fc33f5fa72203b388b074c3545fe7aaa21e474 + "@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-jsx@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-jsx@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.28.6, @babel/parser@npm:^7.29.0": + version: 7.29.3 + resolution: "@babel/parser@npm:7.29.3" 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/types": "npm:^7.29.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10/10e8f34e0fdaa495b9db8be71f4eb29b16d8a57e0818c1bb1c4084015b0383803fd77812ed41597760cbf3d9ab3ae9f4af54f39ff5e5d8e081ba43593232f0ca 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.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.28.6, @babel/template@npm:^7.3.3": - version: 7.28.6 - resolution: "@babel/template@npm:7.28.6" - dependencies: - "@babel/code-frame": "npm:^7.28.6" - "@babel/parser": "npm:^7.28.6" - "@babel/types": "npm:^7.28.6" - checksum: 10/0ad6e32bf1e7e31bf6b52c20d15391f541ddd645cbd488a77fe537a15b280ee91acd3a777062c52e03eedbc2e1f41548791f6a3697c02476ec5daf49faa38533 - languageName: node - linkType: hard - "@babel/template@npm:^7.29.7": version: 7.29.7 resolution: "@babel/template@npm:7.29.7" @@ -1564,18 +500,14 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/traverse@npm:7.29.0" +"@babel/template@npm:^7.3.3": + version: 7.28.6 + resolution: "@babel/template@npm:7.28.6" dependencies: - "@babel/code-frame": "npm:^7.29.0" - "@babel/generator": "npm:^7.29.0" - "@babel/helper-globals": "npm:^7.28.0" - "@babel/parser": "npm:^7.29.0" - "@babel/template": "npm:^7.28.6" - "@babel/types": "npm:^7.29.0" - debug: "npm:^4.3.1" - checksum: 10/3a0d0438f1ba9fed4fbe1706ea598a865f9af655a16ca9517ab57bda526e224569ca1b980b473fb68feea5e08deafbbf2cf9febb941f92f2d2533310c3fc4abc + "@babel/code-frame": "npm:^7.28.6" + "@babel/parser": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/0ad6e32bf1e7e31bf6b52c20d15391f541ddd645cbd488a77fe537a15b280ee91acd3a777062c52e03eedbc2e1f41548791f6a3697c02476ec5daf49faa38533 languageName: node linkType: hard @@ -1594,7 +526,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.28.6, @babel/types@npm:^7.29.0, @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.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.3.3": version: 7.29.0 resolution: "@babel/types@npm:7.29.0" dependencies: @@ -2328,29 +1260,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" @@ -2384,30 +1293,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" @@ -2589,21 +1474,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" @@ -2945,14 +1815,7 @@ __metadata: resolution: "@emnapi/wasi-threads@npm:1.1.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10/0d557e75262d2f4c95cb2a456ba0785ef61f919ce488c1d76e5e3acfd26e00c753ef928cd80068363e0c166ba8cc0141305daf0f81aad5afcd421f38f11e0f4e - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/aix-ppc64@npm:0.25.4" - conditions: os=aix & cpu=ppc64 + checksum: 10/0d557e75262d2f4c95cb2a456ba0785ef61f919ce488c1d76e5e3acfd26e00c753ef928cd80068363e0c166ba8cc0141305daf0f81aad5afcd421f38f11e0f4e languageName: node linkType: hard @@ -2963,13 +1826,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/android-arm64@npm:0.25.4" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/android-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/android-arm64@npm:0.27.7" @@ -2977,13 +1833,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/android-arm@npm:0.25.4" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "@esbuild/android-arm@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/android-arm@npm:0.27.7" @@ -2991,13 +1840,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/android-x64@npm:0.25.4" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - "@esbuild/android-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/android-x64@npm:0.27.7" @@ -3005,13 +1847,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/darwin-arm64@npm:0.25.4" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/darwin-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/darwin-arm64@npm:0.27.7" @@ -3019,13 +1854,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/darwin-x64@npm:0.25.4" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@esbuild/darwin-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/darwin-x64@npm:0.27.7" @@ -3033,13 +1861,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/freebsd-arm64@npm:0.25.4" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/freebsd-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/freebsd-arm64@npm:0.27.7" @@ -3047,13 +1868,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/freebsd-x64@npm:0.25.4" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/freebsd-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/freebsd-x64@npm:0.27.7" @@ -3061,13 +1875,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/linux-arm64@npm:0.25.4" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/linux-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-arm64@npm:0.27.7" @@ -3075,13 +1882,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/linux-arm@npm:0.25.4" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "@esbuild/linux-arm@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-arm@npm:0.27.7" @@ -3089,13 +1889,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/linux-ia32@npm:0.25.4" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/linux-ia32@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-ia32@npm:0.27.7" @@ -3103,13 +1896,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/linux-loong64@npm:0.25.4" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - "@esbuild/linux-loong64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-loong64@npm:0.27.7" @@ -3117,13 +1903,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/linux-mips64el@npm:0.25.4" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - "@esbuild/linux-mips64el@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-mips64el@npm:0.27.7" @@ -3131,13 +1910,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/linux-ppc64@npm:0.25.4" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/linux-ppc64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-ppc64@npm:0.27.7" @@ -3145,13 +1917,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/linux-riscv64@npm:0.25.4" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - "@esbuild/linux-riscv64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-riscv64@npm:0.27.7" @@ -3159,13 +1924,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/linux-s390x@npm:0.25.4" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - "@esbuild/linux-s390x@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-s390x@npm:0.27.7" @@ -3173,13 +1931,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/linux-x64@npm:0.25.4" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - "@esbuild/linux-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/linux-x64@npm:0.27.7" @@ -3187,13 +1938,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/netbsd-arm64@npm:0.25.4" - conditions: os=netbsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/netbsd-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/netbsd-arm64@npm:0.27.7" @@ -3201,13 +1945,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/netbsd-x64@npm:0.25.4" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/netbsd-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/netbsd-x64@npm:0.27.7" @@ -3215,13 +1952,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/openbsd-arm64@npm:0.25.4" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/openbsd-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/openbsd-arm64@npm:0.27.7" @@ -3229,13 +1959,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/openbsd-x64@npm:0.25.4" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/openbsd-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/openbsd-x64@npm:0.27.7" @@ -3250,13 +1973,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/sunos-x64@npm:0.25.4" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - "@esbuild/sunos-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/sunos-x64@npm:0.27.7" @@ -3264,13 +1980,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/win32-arm64@npm:0.25.4" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/win32-arm64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/win32-arm64@npm:0.27.7" @@ -3278,13 +1987,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/win32-ia32@npm:0.25.4" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/win32-ia32@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/win32-ia32@npm:0.27.7" @@ -3292,13 +1994,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.25.4": - version: 0.25.4 - resolution: "@esbuild/win32-x64@npm:0.25.4" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@esbuild/win32-x64@npm:0.27.7": version: 0.27.7 resolution: "@esbuild/win32-x64@npm:0.27.7" @@ -4643,18 +3338,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" @@ -4976,7 +3659,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" @@ -4985,13 +3667,10 @@ __metadata: "@changesets/cli": "npm:^2.29.4" "@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" @@ -5006,55 +3685,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.25.0" - 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: "*" @@ -5665,13 +4324,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" @@ -5842,250 +4494,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 + checksum: 10/a010c8f415d4ec2668298f5cb6b1d8c83d59ea6da15f0576181a23f90c49a4bb5bcd0a22c06a46f38eec5da38d15721a6ae444f99a025efd4da7b69fa173e579 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 +"@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/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-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 -"@svgr/core@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/core@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/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 + "@types/json-schema": "npm:^7.0.4" + utility-types: "npm:^3.10.0" + checksum: 10/4493d75cd7b37766e9e5255cbdee92a639b06d75ef8019a6cad6ab81348377423852e34966a46b270a3e23fc1a1365481d11885c64e98696a28224714d7d676d 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:^14.0.0, @stoplight/types@npm:^14.1.1": + version: 14.1.1 + resolution: "@stoplight/types@npm:14.1.1" 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/1d053f4276872a1c31ef809ec13f57fcfcc3cac65cdd74ddc735c3b4397da6f8a5a8efd99d8c4f5d74cd8342dd28def304d69a4ef623e1f94bd0d5efe6e368be 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:~13.6.0": + version: 13.6.0 + resolution: "@stoplight/types@npm:13.6.0" 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/63b04720784ad267607248aa6059dd7e4f4211deff491fc42b2665e30fb352abb15893c489a5d1f4b6c2675506c5cc420ee772eebd0310dae062eaedcb218cac languageName: node linkType: hard -"@svgr/plugin-svgo@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/plugin-svgo@npm:6.5.1" - dependencies: - cosmiconfig: "npm:^7.0.1" - deepmerge: "npm:^4.2.2" - svgo: "npm:^2.8.0" - peerDependencies: - "@svgr/core": "*" - checksum: 10/cd2833530ac0485221adc2146fd992ab20d79f4b12eebcd45fa859721dd779483158e11dfd9a534858fe468416b9412416e25cbe07ac7932c44ed5fa2021c72e +"@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 -"@svgr/webpack@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/webpack@npm:6.5.1" +"@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 @@ -6606,13 +5102,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" @@ -8085,42 +6574,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" @@ -8433,7 +6886,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: @@ -9228,15 +7681,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" @@ -9264,19 +7708,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" @@ -10185,13 +8616,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" @@ -10427,92 +8851,6 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.25.0": - version: 0.25.4 - resolution: "esbuild@npm:0.25.4" - dependencies: - "@esbuild/aix-ppc64": "npm:0.25.4" - "@esbuild/android-arm": "npm:0.25.4" - "@esbuild/android-arm64": "npm:0.25.4" - "@esbuild/android-x64": "npm:0.25.4" - "@esbuild/darwin-arm64": "npm:0.25.4" - "@esbuild/darwin-x64": "npm:0.25.4" - "@esbuild/freebsd-arm64": "npm:0.25.4" - "@esbuild/freebsd-x64": "npm:0.25.4" - "@esbuild/linux-arm": "npm:0.25.4" - "@esbuild/linux-arm64": "npm:0.25.4" - "@esbuild/linux-ia32": "npm:0.25.4" - "@esbuild/linux-loong64": "npm:0.25.4" - "@esbuild/linux-mips64el": "npm:0.25.4" - "@esbuild/linux-ppc64": "npm:0.25.4" - "@esbuild/linux-riscv64": "npm:0.25.4" - "@esbuild/linux-s390x": "npm:0.25.4" - "@esbuild/linux-x64": "npm:0.25.4" - "@esbuild/netbsd-arm64": "npm:0.25.4" - "@esbuild/netbsd-x64": "npm:0.25.4" - "@esbuild/openbsd-arm64": "npm:0.25.4" - "@esbuild/openbsd-x64": "npm:0.25.4" - "@esbuild/sunos-x64": "npm:0.25.4" - "@esbuild/win32-arm64": "npm:0.25.4" - "@esbuild/win32-ia32": "npm:0.25.4" - "@esbuild/win32-x64": "npm:0.25.4" - 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/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/227ffe9b31f0b184a0b0a0210bb9d32b2b115b8c5c9b09f08db2c3928cb470fc55a22dbba3c2894365d3abcc62c2089b85638be96a20691d1234d31990ea01b2 - languageName: node - linkType: hard - "esbuild@npm:^0.27.1": version: 0.27.7 resolution: "esbuild@npm:0.27.7" @@ -11985,13 +10323,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" @@ -12216,15 +10547,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" @@ -12295,7 +10617,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: @@ -14074,15 +12396,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" @@ -14512,13 +12825,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" @@ -14526,13 +12832,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" @@ -15209,13 +13508,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" @@ -16806,7 +15098,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: @@ -16977,13 +15269,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" @@ -17350,22 +15635,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" @@ -17380,38 +15649,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" @@ -17503,7 +15740,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: @@ -17529,7 +15766,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: @@ -18829,14 +17066,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: @@ -19145,13 +17375,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" @@ -19722,13 +17945,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" @@ -19736,30 +17952,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" @@ -20535,7 +18727,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 @@ -20626,21 +18818,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" @@ -20675,7 +18852,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 From 1bf049583acc6cdc1058a1dc0bd303ef72e79edb Mon Sep 17 00:00:00 2001 From: Hope Hadfield Date: Mon, 14 Sep 2026 12:25:29 -0400 Subject: [PATCH 2/7] feat!: release scalprum removal as 3.0.0 Document the breaking frontend export migration to standard Backstage module federation and NFS metadata. Remove legacy Scalprum options and output references from the supported workflow, and publish the cutover as a major CLI release. Assisted-by: gpt-5.6-luna --- CHANGELOG.md | 15 +++++++++++++++ README.md | 11 +++++++++++ package.json | 2 +- 3 files changed, 27 insertions(+), 1 deletion(-) 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/package.json b/package.json index 653923e..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.1.0", + "version": "3.0.0", "publishConfig": { "access": "public" }, From 60207213a175dc6d28589b977826d413b31d57dc Mon Sep 17 00:00:00 2001 From: Hope Hadfield Date: Mon, 14 Sep 2026 12:25:54 -0400 Subject: [PATCH 3/7] fix: guard legacy frontend file matching Only remove files entries that target dist-scalprum or one of its glob variants, avoiding false positives for unrelated package paths. Assisted-by: gpt-5.6-luna --- src/commands/export-dynamic-plugin/frontend.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/commands/export-dynamic-plugin/frontend.ts b/src/commands/export-dynamic-plugin/frontend.ts index a654a0a..e30f712 100644 --- a/src/commands/export-dynamic-plugin/frontend.ts +++ b/src/commands/export-dynamic-plugin/frontend.ts @@ -44,10 +44,16 @@ function isScalprumFilesEntry(file: string): boolean { const normalizedPath = normalized.startsWith('!') ? normalized.slice(1) : normalized; - const suffix = normalizedPath.slice('dist-scalprum'.length); + if (normalizedPath === 'dist-scalprum') { + return true; + } + + if (!normalizedPath.startsWith('dist-scalprum')) { + return false; + } + const suffix = normalizedPath.slice('dist-scalprum'.length); return ( - normalizedPath === 'dist-scalprum' || suffix.startsWith('/') || suffix.startsWith('*') || suffix.startsWith('?') || From 1b29437eda8edfb8840bfa4a3a2ad204d33ba81b Mon Sep 17 00:00:00 2001 From: Hope Hadfield Date: Mon, 14 Sep 2026 12:26:23 -0400 Subject: [PATCH 4/7] style: group frontend plugin imports Keep the recursive-readdir third-party import with the other package imports and separate it from the Node.js path import. Assisted-by: gpt-5.6-luna --- src/commands/export-dynamic-plugin/frontend.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/export-dynamic-plugin/frontend.ts b/src/commands/export-dynamic-plugin/frontend.ts index e30f712..3032832 100644 --- a/src/commands/export-dynamic-plugin/frontend.ts +++ b/src/commands/export-dynamic-plugin/frontend.ts @@ -21,9 +21,9 @@ import { getPackages } from '@manypkg/get-packages'; import chalk from 'chalk'; import { OptionValues } from 'commander'; import fs from 'fs-extra'; +import recursive from 'recursive-readdir'; import path from 'path'; -import recursive from 'recursive-readdir'; import { productionPack } from '../../lib/packager/productionPack'; import { paths } from '../../lib/paths'; From cb2492d2a57c4d8b556b42fbe53d4a08edc32000 Mon Sep 17 00:00:00 2001 From: Hope Hadfield Date: Mon, 14 Sep 2026 17:00:31 -0400 Subject: [PATCH 5/7] test: remove legacy artifact assertions Keep the e2e coverage focused on the standard module federation output and feature metadata rather than asserting the absence of removed implementation details. Assisted-by: gpt-5.6-luna --- e2e-tests/community-plugins-build-package.test.ts | 9 --------- e2e-tests/rhdh-plugins-build-package.test.ts | 9 --------- 2 files changed, 18 deletions(-) diff --git a/e2e-tests/community-plugins-build-package.test.ts b/e2e-tests/community-plugins-build-package.test.ts index cf3fec3..1fb645f 100644 --- a/e2e-tests/community-plugins-build-package.test.ts +++ b/e2e-tests/community-plugins-build-package.test.ts @@ -113,13 +113,6 @@ describe('export and package backstage-community plugin', () => { path.join(getFullPluginPath(), 'dist-dynamic/dist/remoteEntry.js'), ), ).toEqual(true); - // eslint-disable-next-line jest/no-conditional-expect - expect( - fs.existsSync( - path.join(getFullPluginPath(), 'dist-dynamic/dist-scalprum'), - ), - ).toEqual(false); - const distDynamicPkg = JSON.parse( fs.readFileSync( path.join(getFullPluginPath(), 'dist-dynamic/package.json'), @@ -128,8 +121,6 @@ describe('export and package backstage-community plugin', () => { ); // eslint-disable-next-line jest/no-conditional-expect expect(distDynamicPkg.backstage?.features).toEqual(expectedFeatures); - // eslint-disable-next-line jest/no-conditional-expect - expect(distDynamicPkg).not.toHaveProperty('scalprum'); } }); diff --git a/e2e-tests/rhdh-plugins-build-package.test.ts b/e2e-tests/rhdh-plugins-build-package.test.ts index 60b0398..201b762 100644 --- a/e2e-tests/rhdh-plugins-build-package.test.ts +++ b/e2e-tests/rhdh-plugins-build-package.test.ts @@ -113,13 +113,6 @@ describe('export and package rhdh-plugins scorecard workspace plugin', () => { path.join(getFullPluginPath(), 'dist-dynamic/dist/remoteEntry.js'), ), ).toEqual(true); - // eslint-disable-next-line jest/no-conditional-expect - expect( - fs.existsSync( - path.join(getFullPluginPath(), 'dist-dynamic/dist-scalprum'), - ), - ).toEqual(false); - const distDynamicPkg = JSON.parse( fs.readFileSync( path.join(getFullPluginPath(), 'dist-dynamic/package.json'), @@ -128,8 +121,6 @@ describe('export and package rhdh-plugins scorecard workspace plugin', () => { ); // eslint-disable-next-line jest/no-conditional-expect expect(distDynamicPkg.backstage?.features).toEqual(expectedFeatures); - // eslint-disable-next-line jest/no-conditional-expect - expect(distDynamicPkg).not.toHaveProperty('scalprum'); } }); From 279c196f7180f63d07ba5709b904f66536a8bf7a Mon Sep 17 00:00:00 2001 From: Hope Hadfield Date: Mon, 14 Sep 2026 17:07:02 -0400 Subject: [PATCH 6/7] refactor: simplify legacy asset matching Use the minimal dist-scalprum substring check for the small set of supported frontend packages, as suggested in review. --- .../export-dynamic-plugin/frontend.ts | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/src/commands/export-dynamic-plugin/frontend.ts b/src/commands/export-dynamic-plugin/frontend.ts index 3032832..a6847a1 100644 --- a/src/commands/export-dynamic-plugin/frontend.ts +++ b/src/commands/export-dynamic-plugin/frontend.ts @@ -39,28 +39,6 @@ function isTruthyCiEnv(value: string | undefined): boolean { return normalized === 'true' || normalized === '1' || normalized === 'yes'; } -function isScalprumFilesEntry(file: string): boolean { - const normalized = file.replaceAll('\\', '/'); - const normalizedPath = normalized.startsWith('!') - ? normalized.slice(1) - : normalized; - if (normalizedPath === 'dist-scalprum') { - return true; - } - - if (!normalizedPath.startsWith('dist-scalprum')) { - return false; - } - - const suffix = normalizedPath.slice('dist-scalprum'.length); - return ( - suffix.startsWith('/') || - suffix.startsWith('*') || - suffix.startsWith('?') || - suffix.startsWith('[') - ); -} - export async function frontend( _: PackageRoleInfo, opts: OptionValues, @@ -155,7 +133,7 @@ export async function frontend( // which are related to the packaging of the original static package. scripts: {}, files: Array.isArray(files) - ? files.filter((file: string) => !isScalprumFilesEntry(file)) + ? files.filter((file: string) => !file.includes('dist-scalprum')) : files, }, rootResolutions, From f7f74b7d82af6f8b46e2e6ef4807fa948c83cd61 Mon Sep 17 00:00:00 2001 From: Hope Hadfield Date: Mon, 14 Sep 2026 17:09:12 -0400 Subject: [PATCH 7/7] fix: reject legacy scalprum plugin content Fail frontend exports when plugin metadata, files entries, or output directories still reference Scalprum instead of silently filtering or cleaning them. --- .../export-dynamic-plugin/frontend.ts | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/commands/export-dynamic-plugin/frontend.ts b/src/commands/export-dynamic-plugin/frontend.ts index a6847a1..b1653a0 100644 --- a/src/commands/export-dynamic-plugin/frontend.ts +++ b/src/commands/export-dynamic-plugin/frontend.ts @@ -21,7 +21,6 @@ import { getPackages } from '@manypkg/get-packages'; import chalk from 'chalk'; import { OptionValues } from 'commander'; import fs from 'fs-extra'; -import recursive from 'recursive-readdir'; import path from 'path'; @@ -46,6 +45,27 @@ export async function frontend( const originalPkg = await fs.readJson(paths.resolveTarget('package.json')); const { name, files } = originalPkg; + if ('scalprum' in originalPkg) { + throw new Error( + 'Frontend plugin export no longer supports the `scalprum` package field; remove it before exporting', + ); + } + + 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`, + ); + } + + 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', + ); + } + if (opts.clean) { await fs.remove(path.join(paths.targetDir, 'dist')); } @@ -102,10 +122,6 @@ export async function frontend( targetDir: target, }); - // Remove stale Scalprum output that may have been included by npm-packlist - // before the derived package manifest is customized below. - await fs.remove(path.join(target, 'dist-scalprum')); - Task.log( `Customizing main package in ${chalk.cyan( path.join(distDynamicRelativePath, 'package.json'), @@ -132,13 +148,10 @@ export async function frontend( // and obviously this should not trigger the backstage pre-pack or post-pack actions // which are related to the packaging of the original static package. scripts: {}, - files: Array.isArray(files) - ? files.filter((file: string) => !file.includes('dist-scalprum')) - : files, + files, }, rootResolutions, after: pkg => { - delete (pkg as unknown as Record).scalprum; if (detectedFeatures) { pkg.backstage = pkg.backstage ?? {}; pkg.backstage.features = detectedFeatures; @@ -146,14 +159,5 @@ export async function frontend( }, })(path.resolve(target, 'package.json')); - const legacyScalprumFiles = (await recursive(target)).filter(file => - path.relative(target, file).split(path.sep).includes('dist-scalprum'), - ); - if (legacyScalprumFiles.length > 0) { - throw new Error( - `The exported package contains legacy Scalprum files: ${legacyScalprumFiles.join(', ')}`, - ); - } - return target; }