diff --git a/.changeset/calm-avocados-exercise.md b/.changeset/calm-avocados-exercise.md new file mode 100644 index 0000000000..c62ae4bd83 --- /dev/null +++ b/.changeset/calm-avocados-exercise.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-common': patch +--- + +New K8s catalog entity annotations added that will replace now deprecated k8s annotations in the catalog-model package. K8s annotation imports should now be made from plugin-kubernetes-common. diff --git a/.changeset/clean-queens-judge.md b/.changeset/clean-queens-judge.md new file mode 100644 index 0000000000..a394bfa9a7 --- /dev/null +++ b/.changeset/clean-queens-judge.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +The process of adding or modifying fields in the software-catalog search index has been simplified. For more details, see [how to customize fields in the Software Catalog index](https://backstage.io/docs/features/search/how-to-guides#how-to-customize-fields-in-the-software-catalog-index). diff --git a/.changeset/cold-cycles-switch.md b/.changeset/cold-cycles-switch.md new file mode 100644 index 0000000000..0df71a82d3 --- /dev/null +++ b/.changeset/cold-cycles-switch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Adding new Cluster detail fields to catalogClusterLocator. Replace deprecated imports with k8s annotations from plugin-kubernetes-common. diff --git a/.changeset/create-app-1674561612.md b/.changeset/create-app-1674561612.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1674561612.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/eight-hotels-sparkle.md b/.changeset/eight-hotels-sparkle.md new file mode 100644 index 0000000000..6846630e02 --- /dev/null +++ b/.changeset/eight-hotels-sparkle.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Show module name causing error during build diff --git a/.changeset/friendly-scissors-shop.md b/.changeset/friendly-scissors-shop.md new file mode 100644 index 0000000000..03c67ba491 --- /dev/null +++ b/.changeset/friendly-scissors-shop.md @@ -0,0 +1,12 @@ +--- +'@backstage/plugin-scaffolder': minor +--- + +- **Deprecation** - Deprecated the following exports, please import them directly from `@backstage/plugin-scaffolder-react` instead + + ``` + createScaffolderLayout + ScaffolderLayouts + LayoutOptions + LayoutTemplate + ``` diff --git a/.changeset/grumpy-bottles-stare.md b/.changeset/grumpy-bottles-stare.md new file mode 100644 index 0000000000..1e6040f57f --- /dev/null +++ b/.changeset/grumpy-bottles-stare.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +Upgrade `@rjsf` version 5 dependencies to `beta.18` diff --git a/.changeset/itchy-goats-melt.md b/.changeset/itchy-goats-melt.md new file mode 100644 index 0000000000..d073dd4103 --- /dev/null +++ b/.changeset/itchy-goats-melt.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch +'@backstage/plugin-scaffolder-backend-module-sentry': patch +'@backstage/plugin-scaffolder-backend-module-yeoman': patch +'@backstage/plugin-scaffolder-backend-module-rails': patch +--- + +Internal refactor to use the new `@backstage/plugin-scaffolder-node` package for some functionality diff --git a/.changeset/lazy-badgers-try.md b/.changeset/lazy-badgers-try.md new file mode 100644 index 0000000000..4ffb32304a --- /dev/null +++ b/.changeset/lazy-badgers-try.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-node': minor +--- + +New package that takes over some of the types and functionality from `@backstage/plugin-scaffolder-backend` that are shared with other modules diff --git a/.changeset/lemon-tables-train.md b/.changeset/lemon-tables-train.md new file mode 100644 index 0000000000..80b64bfe53 --- /dev/null +++ b/.changeset/lemon-tables-train.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-aws': patch +--- + +Added support for `externalId` when assuming role in `AwsS3EntityProvider` diff --git a/.changeset/lovely-ladybugs-taste.md b/.changeset/lovely-ladybugs-taste.md new file mode 100644 index 0000000000..24017e4dee --- /dev/null +++ b/.changeset/lovely-ladybugs-taste.md @@ -0,0 +1,10 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +**Deprecations**: The following are deprecated and should instead be imported from the new package `@backstage/plugin-scaffolder-node`: + +- `ActionContext` +- `createTemplateAction` +- `TaskSecrets` +- `TemplateAction` diff --git a/.changeset/nervous-apricots-whisper.md b/.changeset/nervous-apricots-whisper.md new file mode 100644 index 0000000000..ce71486364 --- /dev/null +++ b/.changeset/nervous-apricots-whisper.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Improve view: remove footer overlay on large screen diff --git a/.changeset/nervous-mangos-rhyme.md b/.changeset/nervous-mangos-rhyme.md new file mode 100644 index 0000000000..23e92c65a7 --- /dev/null +++ b/.changeset/nervous-mangos-rhyme.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-msgraph': patch +--- + +Extract default transformers to their own file diff --git a/.changeset/nine-glasses-invent.md b/.changeset/nine-glasses-invent.md new file mode 100644 index 0000000000..beb69b3b90 --- /dev/null +++ b/.changeset/nine-glasses-invent.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes': patch +--- + +Condenses kubernetes ui plugin to fit more onscreen and increase visibility diff --git a/.changeset/poor-moons-confess.md b/.changeset/poor-moons-confess.md new file mode 100644 index 0000000000..7fbdc292ed --- /dev/null +++ b/.changeset/poor-moons-confess.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-incremental-ingestion': minor +--- + +Return EventSubscriber from addIncrementalEntityProvider to hook up to EventsBackend diff --git a/.changeset/pre.json b/.changeset/pre.json index 9f9a48e8dc..0d150702fb 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -194,7 +194,40 @@ "@backstage/plugin-user-settings-backend": "0.1.4", "@backstage/plugin-vault": "0.1.8", "@backstage/plugin-vault-backend": "0.2.6", - "@backstage/plugin-xcmetrics": "0.2.34" + "@backstage/plugin-xcmetrics": "0.2.34", + "@backstage/plugin-scaffolder-node": "0.0.0" }, - "changesets": [] + "changesets": [ + "bright-eagles-love", + "brown-islands-own", + "calm-avocados-exercise", + "cold-cycles-switch", + "create-app-1674561612", + "cyan-deers-walk", + "eight-falcons-explode", + "flat-cups-itch", + "friendly-scissors-shop", + "gold-lemons-eat", + "gold-masks-sleep", + "itchy-goats-melt", + "khaki-toes-care", + "lazy-badgers-rule", + "lazy-badgers-try", + "lemon-tables-train", + "lovely-ladybugs-taste", + "nervous-apricots-whisper", + "nervous-mangos-rhyme", + "perfect-cheetahs-serve", + "pink-falcons-serve", + "quick-ladybugs-reply", + "rare-melons-battle", + "rotten-mayflies-love", + "shiny-years-tap", + "silly-turkeys-hang", + "spotty-coats-clean", + "stale-dots-smile", + "swift-fishes-smash", + "twenty-parents-relate", + "young-singers-learn" + ] } diff --git a/.changeset/renovate-0b349f9.md b/.changeset/renovate-0b349f9.md new file mode 100644 index 0000000000..810adfbc46 --- /dev/null +++ b/.changeset/renovate-0b349f9.md @@ -0,0 +1,8 @@ +--- +'@backstage/backend-common': patch +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-kubernetes-common': patch +'@backstage/plugin-kubernetes': patch +--- + +Updated dependency `@kubernetes/client-node` to `0.18.1`. diff --git a/.changeset/rotten-mayflies-love.md b/.changeset/rotten-mayflies-love.md new file mode 100644 index 0000000000..24d4e4d1be --- /dev/null +++ b/.changeset/rotten-mayflies-love.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-user-settings': patch +--- + +Added a message to advise a page reload when toggling feature flags diff --git a/.changeset/shiny-years-tap.md b/.changeset/shiny-years-tap.md new file mode 100644 index 0000000000..d0d0c14c0a --- /dev/null +++ b/.changeset/shiny-years-tap.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-github-issues': patch +--- + +Updated README.md examples to use correct components and fixed some syntax errors. diff --git a/.changeset/silly-turkeys-hang.md b/.changeset/silly-turkeys-hang.md new file mode 100644 index 0000000000..9f712a43c8 --- /dev/null +++ b/.changeset/silly-turkeys-hang.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-scaffolder-react': patch +--- + +Add `ScaffolderLayouts` to `NextScaffolderPage` diff --git a/.changeset/smart-dingos-raise.md b/.changeset/smart-dingos-raise.md new file mode 100644 index 0000000000..ea3b0ec82e --- /dev/null +++ b/.changeset/smart-dingos-raise.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Renamed the export `scaffolderCatalogModule` to `catalogModuleTemplateKind` in order to follow the new recommended naming patterns of backend system items. This is technically a breaking change but in an alpha export, so take care to change your imports if you have already migrated to the new backend system. diff --git a/.changeset/stale-dots-smile.md b/.changeset/stale-dots-smile.md new file mode 100644 index 0000000000..dc1abc926e --- /dev/null +++ b/.changeset/stale-dots-smile.md @@ -0,0 +1,5 @@ +--- +'@backstage/catalog-model': patch +--- + +Add deprecation tag to kubernetes constants in catalog, constants are now defined in plugin-kubernetes-common diff --git a/.changeset/swift-fishes-smash.md b/.changeset/swift-fishes-smash.md new file mode 100644 index 0000000000..cf3f00129c --- /dev/null +++ b/.changeset/swift-fishes-smash.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +`HttpRouterFactoryOptions.getPath` is now optional as a default value is always provided in the factory. diff --git a/.changeset/young-singers-learn.md b/.changeset/young-singers-learn.md new file mode 100644 index 0000000000..9df5d91fe3 --- /dev/null +++ b/.changeset/young-singers-learn.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-splunk-on-call': patch +--- + +Refactor plugin Card component to not rerender contents unnecessarily. diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index 98160a496d..d8c962ecc2 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -70,6 +70,7 @@ cron cronjobs crontab css +daemonsets Datadog dataflow dayjs @@ -177,6 +178,7 @@ learnings Leasot lerna Lerna +limitranges LocalStack lockdown lockfile diff --git a/docs/backend-system/architecture/02-backends.md b/docs/backend-system/architecture/02-backends.md index c73a899863..69b74e7dd3 100644 --- a/docs/backend-system/architecture/02-backends.md +++ b/docs/backend-system/architecture/02-backends.md @@ -3,12 +3,15 @@ id: backends title: Backend Instances sidebar_label: Backend # prettier-ignore -description: Service APIs for backend plugins +description: Backend instances --- -The new Backstage backend system is being built to help make it simpler to install backend plugins and to keep projects up to date. It also changes the foundation to one that makes it a lot easier to evolve plugins and the system itself with minimal disruption or cause for breaking changes. You can read more about the reasoning in the [original RFC](https://github.com/backstage/backstage/issues/11611). +## The Backend Instance -One of the goals of the new system was to reduce the code needed for setting up a Backstage backend and installing plugins. This is an example of how you create, add features, and start up your backend in the new system: +This is the main entry point for creating a backend. It does not have any functionality in and of itself, but is simply responsible for wiring things together. +It is up to you to decide how many different backends you want to deploy. You can have all features in a single one, or split things out into multiple smaller deployments. + +Below is a simple example of a backend that installs only the catalog plugin and starts it up. ```ts import { createBackend } from '@backstage/backend-defaults'; @@ -24,4 +27,12 @@ backend.add(catalogPlugin()); await backend.start(); ``` -One notable change that helped achieve this much slimmer backend setup is the introduction of a system for dependency injection, which is very similar to the one in the Backstage frontend. +`createBackend` is responsible for creating your backend instance, and wiring up all the services that you have provided. It deals with creating default implementations of all the [core services](../core-services/01-index.md) that are used by the plugins, and also provides a way to override the default implementations with your own. You can read more about creating services and overriding them in the [building backends docs](../building-backends/01-index.md). + +The backend instance has the ability to add features to the backend which are done using the `.add` method. Features are either plugins or modules, and you can read more about them in the [building plugins and modules docs](../building-plugins-and-modules/01-index.md). By default, a backend instance has no default features, and the services are responsible for wiring everything together. + +At a high level, when you call `createBackend`, it will create a new backend instance, which has a registry of all the services that are currently registered, and by adding features to the backend instance and calling the `.start()` method it will ensure that all the dependencies are wired up correctly and the `registerInit` methods are called in the correct order. + +Underneath the hood, `createBackend` calls `createSpecializedBackend` from `@backstage/backend-app-api` which is responsible for actually creating the backend instance, but with no services or no features. You can think of `createBackend` more of a 'batteries included' approach, and `createSpecializedBackend` a little more low level. + +As mentioned previously there's also the ability to create multiple of these backends in your project so that you can split apart your backend and deploy different backends that can scale independently of each other. For instance you might choose to deploy a backend with only the catalog plugin enabled, and one with just the scaffolder plugin enabled. We've provided some tools to be able to share services and defaults across your backend system, and you can find out more about that in the [shared environments docs](../building-backends/01-index.md#shared-environments). diff --git a/docs/backend-system/architecture/04-plugins.md b/docs/backend-system/architecture/04-plugins.md index 6f077a0d2d..f535268b2a 100644 --- a/docs/backend-system/architecture/04-plugins.md +++ b/docs/backend-system/architecture/04-plugins.md @@ -6,29 +6,26 @@ sidebar_label: Plugins description: Backend plugins --- -## Creating Plugins +Plugins provide the actual base features of a Backstage backend. Each plugin operates completely independently of all other plugins and they only communicate with each other through network calls. This means that there is a strong degree of isolation between plugins, and that each plugin can be considered a separate microservice. While a default Backstage project has all plugins installed within a single backend, it is also possible to split this setup into multiple backends, with each backend housing one or more plugins. -Plugins are created using the `createBackendPlugin` function. All plugins must have an ID and a register method. Plugins may also accept an options object, which can be either optional or required. The options are passed to the second parameter of the register method, and the options type is inferred and forwarded to the returned plugin factory function. +## Defining a Plugin + +Plugins are created using the `createBackendPlugin` function, and should typically be exported from a plugin package. All plugins must have an ID and a `register` method, where the ID matches the plugin ID in the package name, without the `-backend` suffix. See also the [dedicated section](./07-naming-patterns.md) about proper naming patterns. ```ts +// plugins/example-backend/src/plugin.ts import { - configServiceRef, coreServices, createBackendPlugin, } from '@backstage/backend-plugin-api'; -// export type ExamplePluginOptions = { exampleOption: boolean }; export const examplePlugin = createBackendPlugin({ - // unique id for the plugin id: 'example', - // It's possible to provide options to the plugin - // register(env, options: ExamplePluginOptions) { register(env) { env.registerInit({ deps: { logger: coreServices.logger, }, - // logger is provided by the backend based on the dependency on loggerServiceRef above. async init({ logger }) { logger.info('Hello from example plugin'); }, @@ -37,32 +34,60 @@ export const examplePlugin = createBackendPlugin({ }); ``` -The plugin can then be installed in the backend using the returned plugin factory function: +The `env` object passed to the `register` callback contains different methods that declare the external surface of the plugin. The `env.registerInit` method is used to register an initialization function that is run when the backend starts up. The `deps` argument is used to declare service dependencies, and the `init` callback is passed an object with the resolved dependencies. In this case, we declare a dependency on the logger service, which is one of the core services available to all Backstage backend plugins. For a full list of core services as well as documentation for each services, see the [core services section](../core-services/01-index.md). Plugins can of course also depend on services exported by other libraries. + +The `createBackendPlugin` return value is exported as `examplePlugin`, which is a factory function used to create the actual plugin instance. For example, to install the plugin in your backend instance, you would do the following: ```ts backend.add(examplePlugin()); ``` -If we wanted our plugin to accept options as well, we'd accept the options as the second parameter of the register method: +The reason for why our plugin instance has been wrapped up in a factory function is so that you can always chose to add options to your plugin in the future, without breaking existing usage. To add options you wrap the object passed to `createBackendPlugin` in a callback that accepts the desired options. For example: ```ts -export const examplePlugin = createBackendPlugin({ - id: 'example', - register(env, options?: { silent?: boolean }) { - env.registerInit({ - deps: { logger: coreServices.logger }, - async init({ logger }) { - if (!options?.silent) { - logger.info('Hello from example plugin'); - } - }, - }); - }, -}); +export interface ExamplePluginOptions { + skipHello: boolean; +} + +export const examplePlugin = createBackendPlugin( + (options?: ExamplePluginOptions) => ({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + logger: coreServices.logger, + }, + async init({ logger }) { + if (!options?.skipHello) { + logger.info('Hello from example plugin'); + } + }, + }); + }, + }), +); ``` -Passing the option to the plugin during installation looks like this: +Now your plugin accepts an optional options object, which can be used to configure each plugin instance. To supply options to the plugin, you pass them to the plugin factory method: ```ts -backend.add(examplePlugin({ silent: true })); +backend.add(examplePlugin({ skipHello: true })); ``` + +It is also possible to make the options required, simply remove the `?` from the parameter declaration. This will be reflected in the returned factory function, which will now require the options parameter. + +Options are a simple way to allow for more lightweight customization of a plugin, but they do not allow for more complex extensions that require access to services. For that, you need to create and register extension points for your plugin, which are covered in the [next section](./05-extension-points.md). + +## Rules of Plugins + +The following rules apply to the production setup of Backstage plugins in the broader Backstage plugin ecosystem. Any plugin that is maintained under the `@backstage` package namespace should follow these rules, and it is recommended that all widely distributed plugins follow these rules as well. + +An exception to these rules are made for development or test setups, where shortcuts can be take in order to streamline development and keep things simple. + +### Scalable + +Plugins must always be designed to be horizontally scalable. This means that you should not keep any state in memory, or make sure that replicating this state across multiple instances is not an issue. Plugins should either be stateless, or store their state in an external service, such as a database. + +### Isolated + +Plugins must never communicate with each other directly through code, they may only communicate over the network. Plugins that wish to expose an external interface for other plugins and modules to use are recommended to do so though a [node-library](../../local-dev/cli-build-system.md#package-roles) package. The library should export an API client service to make calls to your plugin, or similar construct. diff --git a/docs/backend-system/building-backends/01-index.md b/docs/backend-system/building-backends/01-index.md index e1f8f87964..f810417ed7 100644 --- a/docs/backend-system/building-backends/01-index.md +++ b/docs/backend-system/building-backends/01-index.md @@ -21,14 +21,16 @@ When you create a new project with `@backstage/create-app`, you'll get a backend import { createBackend } from '@backstage/backend-defaults'; import { appPlugin } from '@backstage/plugin-app-backend'; import { catalogPlugin } from '@backstage/plugin-catalog-backend'; -import { scaffolderCatalogModule } from '@backstage/plugin-scaffolder-backend'; -import { scaffolderPlugin } from '@backstage/plugin-scaffolder-backend'; +import { + scaffolderPlugin, + catalogModuleTemplateKind, +} from '@backstage/plugin-scaffolder-backend'; const backend = createBackend(); backend.add(appPlugin()); backend.add(catalogPlugin()); -backend.add(scaffolderCatalogModule()); +backend.add(catalogModuleTemplateKind()); backend.add(scaffolderPlugin()); backend.start(); @@ -129,7 +131,7 @@ const backend = createBackend(); backend.add(appPlugin()); backend.add(catalogPlugin()); -backend.add(scaffolderCatalogModule()); +backend.add(catalogModuleTemplateKind()); backend.start(); ``` diff --git a/docs/backend-system/building-backends/08-migrating.md b/docs/backend-system/building-backends/08-migrating.md index fcac599227..6e0b84b10f 100644 --- a/docs/backend-system/building-backends/08-migrating.md +++ b/docs/backend-system/building-backends/08-migrating.md @@ -240,11 +240,11 @@ A basic installation of the catalog plugin looks as follows. ```diff // packages/backend/src/index.ts +import { catalogPlugin } from '@backstage/plugin-catalog-backend'; -+import { scaffolderCatalogModule } from '@backstage/plugin-scaffolder-backend'; ++import { catalogModuleTemplateKind } from '@backstage/plugin-scaffolder-backend'; const backend = createBackend(); +backend.add(catalogPlugin()); -+backend.add(scaffolderCatalogModule()); ++backend.add(catalogModuleTemplateKind()); ``` Note that this also installs a module from the scaffolder, namely the one which @@ -265,9 +265,9 @@ depends on the appropriate extension point and interacts with it. +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node'; +import { createBackendModule } from '@backstage/backend-plugin-api'; -+const catalogExtensionsModule = createBackendModule({ -+ pluginId: 'catalog', // name of the plugin that the module is targeting -+ moduleId: 'extensions', // you can choose this one freely ++const catalogModuleCustomExtensions = createBackendModule({ ++ pluginId: 'catalog', // name of the plugin that the module is targeting ++ moduleId: 'customExtensions', + register(env) { + env.registerInit({ + deps: { @@ -286,8 +286,8 @@ depends on the appropriate extension point and interacts with it. const backend = createBackend(); backend.add(catalogPlugin()); - backend.add(scaffolderCatalogModule()); -+backend.add(catalogExtensionsModule()); + backend.add(catalogModuleTemplateKind()); ++backend.add(catalogModuleCustomExtensions()); ``` This also requires that you have a dependency on the corresponding node package, @@ -330,9 +330,9 @@ depends on the appropriate extension point and interacts with it. +import { eventsExtensionPoint } from '@backstage/plugin-events-node'; +import { createBackendModule } from '@backstage/backend-plugin-api'; -+const eventsExtensionsModule = createBackendModule({ -+ pluginId: 'events', // name of the plugin that the module is targeting -+ moduleId: 'extensions', // you can choose this one freely ++const eventsModuleCustomExtensions = createBackendModule({ ++ pluginId: 'events', // name of the plugin that the module is targeting ++ moduleId: 'customExtensions', + register(env) { + env.registerInit({ + deps: { @@ -350,7 +350,7 @@ depends on the appropriate extension point and interacts with it. const backend = createBackend(); backend.add(eventsPlugin()); -+backend.add(eventsExtensionsModule()); ++backend.add(eventsModuleCustomExtensions()); ``` This also requires that you have a dependency on the corresponding node package, @@ -390,13 +390,12 @@ depends on the appropriate extension point and interacts with it. ```diff // packages/backend/src/index.ts - // TODO: This might be moved to @backstage/plugin-scaffolder-node -+import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-backend/alpha'; ++import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; +import { createBackendModule } from '@backstage/backend-plugin-api'; -+const scaffolderExtensionsModule = createBackendModule({ -+ pluginId: 'scaffolder', // name of the plugin that the module is targeting -+ moduleId: 'extensions', // you can choose this one freely ++const scaffolderModuleCustomExtensions = createBackendModule({ ++ pluginId: 'scaffolder', // name of the plugin that the module is targeting ++ moduleId: 'customExtensions', + register(env) { + env.registerInit({ + deps: { @@ -414,7 +413,7 @@ depends on the appropriate extension point and interacts with it. const backend = createBackend(); backend.add(scaffolderPlugin()); -+backend.add(scaffolderExtensionsModule()); ++backend.add(scaffolderModuleCustomExtensions()); ``` This also requires that you have a dependency on the corresponding node package, diff --git a/docs/backend-system/building-plugins-and-modules/01-index.md b/docs/backend-system/building-plugins-and-modules/01-index.md index fff82286ad..05908e59cb 100644 --- a/docs/backend-system/building-plugins-and-modules/01-index.md +++ b/docs/backend-system/building-plugins-and-modules/01-index.md @@ -9,4 +9,237 @@ description: Building backend plugins and modules using the new backend system > NOTE: If you have an existing backend and/or backend plugins that are not yet > using the new backend system, see [migrating](./08-migrating.md). -# Overview +## Overview + +Backend [plugins](../architecture/04-plugins.md) and +[modules](../architecture/06-modules.md), sometimes collectively referred to as +backend _features_, are the building blocks that adopters add to their +[backends](../architecture/02-backends.md). + +## Plugins + +A basic backend plugin might look as follows: + +```ts +import { + createBackendPlugin, + coreServices, +} from '@backstage/backend-plugin-api'; +import { createExampleRouter } from './router'; + +export const examplePlugin = createBackendPlugin({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + // Declare dependencies to services that you want to consume + logger: coreServices.logger, + httpRouter: coreServices.httpRouter, + }, + async init({ + // Requested service instances get injected as per above + logger, + httpRouter, + }) { + // Perform your initialization and access the services as needed + const example = createExampleRouter(logger); + logger.info('Hello from example plugin'); + httpRouter.use(example); + }, + }); + }, +}); +``` + +When you depend on `plugin` scoped services, you'll receive an instance of them +that's specific to your plugin. In the example above, the logger might tag +messages with your plugin ID, and the HTTP router might prefix API routes with +your plugin ID, depending on the implementation used. + +See [the article on naming patterns](../architecture/07-naming-patterns.md) for +details on how to best choose names/IDs for plugins and related backend system +items. + +## Modules + +Backend modules are used to extend [plugins](../architecture/04-plugins.md) with +additional features or change existing behavior. They must always be installed +in the same backend instance as the plugin that they extend, and may only extend +a single plugin. Modules interact with their target plugin using the [extension +points](./05-extension-points.md) registered by the plugin, while also being +able to depend on the [services](../architecture/03-services.md) of that plugin. +That last point is worth reiterating: injected `plugin` scoped services will be +the exact +same ones as the target plugin will receive later, i.e. they will be scoped +using the target `pluginId` of the module. + +A module depends on the extension points exported by the target plugin's library +package, for example `@backstage/plugin-catalog-node`, and does not directly +declare a dependency on the plugin package itself. This is to avoid a direct +dependency and potentially cause duplicate installations of the plugin package, +while duplicate installations of library packages should always be supported. + +The following is an example of how to create a module that adds a new processor +using the `catalogProcessingExtensionPoint`: + +```ts +import { createBackendModule } from '@backstage/backend-plugin-api'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node'; +import { MyCustomProcessor } from './MyCustomProcessor'; + +export const catalogModuleExampleCustomProcessor = createBackendModule({ + moduleId: 'exampleCustomProcessor', + pluginId: 'catalog', + register(env) { + env.registerInit({ + deps: { + catalog: catalogProcessingExtensionPoint, + logger: coreServices.logger, + }, + async init({ catalog }) { + catalog.addProcessor(new MyCustomProcessor(logger)); + }, + }); + }, +}); +``` + +See [the article on naming patterns](../architecture/07-naming-patterns.md) for +details on how to best choose names/IDs for modules and related backend system +items. + +Notice that we're placing the extension point we want to interact with in the +`deps` option, while also depending on the logger service at the same time. When +initializing modules we can depend on both extension points and services +interchangeably. You can also depend on multiple extension points at once, in +case the implementation of the module requires it. + +It is typically best to keep modules slim and to each only add a single new +feature. It is often the case that it is better to create two separate modules +rather than one that provides both features. The one limitation here is that +modules can not interact with each other and need to be self contained. + +### HTTP Handlers + +Since modules have access to the same services as the plugin they extend, they +are also able to register their own HTTP handlers. For more information about +the HTTP service, see [core services](../core-services/01-index.md). When +registering HTTP handlers, it is important to try to avoid any future conflict +with the plugin itself, or other modules. A recommended naming pattern is to +register the handlers under the `/modules/` path, where `` +is the kebab-case ID of the module, for example +`/modules/example-custom-processor/v1/validators`. In a standard backend setup +the full path would then be +`/api/catalog/modules/example-custom-processor/v1/validators`. + +### Database Access + +The same applies for modules that perform their own migrations and interact with +the database. They will run on the same logical database instance as the target +plugin, so care must be taken to choose table names that do not risk colliding +with those of the plugin. A recommended naming pattern is `__`, for example the `@backstage/backend-tasks` package creates +tables named `backstage_backend_tasks__
`. If you use the default [`Knex` +migration facilities](https://knexjs.org/guide/migrations.html), you will also +want to make sure that it uses similarly prefixed migration state tables for its +internal bookkeeping needs, so they do not collide with the main ones used by +the plugin itself. You can do this as follows: + +```ts +await knex.migrate.latest({ + directory: migrationsDir, + tableName: 'backstage_backend_tasks__knex_migrations', +}); +``` + +## Customization + +There are several ways of configuring and customizing plugins and modules. + +### Extension Points + +Whenever you want to allow modules to configure your plugin dynamically, for +example in the way that the catalog backend lets catalog modules inject +additional entity providers, you can use the extension points mechanism. This is +described in detail with code examples in [the extension points architecture +article](../architecture/05-extension-points.md). + +### Configuration + +Your plugin or module can leverage the app configuration to configure its own +internal behavior. You do this by adding a dependency on `coreServices.config` +and reading from that. This pattern is a good fit especially for customization +that needs to be different across environments. + +```ts +import { coreServices } from '@backstage/backend-plugin-api'; + +export const examplePlugin = createBackendPlugin({ + id: 'example', + register(env) { + env.registerInit({ + deps: { config: coreServices.config }, + async init({ config }) { + // Here you can read from the current config as you see fit, e.g.: + const value = config.getOptionalString('example.value'); + }, + }); + }, +}); +``` + +Before adding custom configuration options, make sure to read [the configuration +docs](../../conf/index.md), in particular the section on [defining configuration +for your own plugins](../../conf/defining.md) which explains how to establish a +configuration schema for your specific plugin. + +### Options + +You'll have noted that the return values from `createBackendPlugin` and +`createBackendModule` are actually factory functions. These can be made to +accept options that shall be passed in at initialization time. + +This pattern can be a good fit for fairly simple, static configuration values. + +```ts +export interface ExampleOptions { + silent?: boolean; +} + +export const examplePlugin = createBackendPlugin( + (options?: ExampleOptions) => ({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + // Omitted dependencies but they remain the same as above + }, + async init( + { + /* ... */ + }, + ) { + // Here you can access the given options and act accordingly, e.g.: + if (!options?.silent) { + // ... + } + }, + }); + }, + }), +); +``` + +The return type from `createBackendPlugin` and `createBackendModule` will mimic +this, resulting in a factory function that accepts an optional options object. +You can also make it required to pass in options, by removing the optionality +(the question mark on the options) above. + +```ts +backend.add(examplePlugin({ silent: true })); +``` + +Use this pattern sparingly. There is a big convenience benefit in allowing +people to easily install backend plugins without having to always pass in a +large number of options, and these options cannot easily be made dynamic based +on the environment etc. diff --git a/docs/backend-system/building-plugins-and-modules/02-testing.md b/docs/backend-system/building-plugins-and-modules/02-testing.md index e8a8619f72..20bef6fec4 100644 --- a/docs/backend-system/building-plugins-and-modules/02-testing.md +++ b/docs/backend-system/building-plugins-and-modules/02-testing.md @@ -6,21 +6,161 @@ sidebar_label: Testing description: Learn how to test your backend plugins and modules --- -Utilities for testing backend plugins and modules are available in `@backstage/backend-test-utils`. -`startTestBackend` returns a server which can be used together with `supertest` to test the plugins. +Utilities for testing backend plugins and modules are available in +`@backstage/backend-test-utils`. This section describes those facilities. + +## Testing Backend Plugins and Modules + +To facilitate testing of backend plugins and modules, the +`@backstage/backend-test-utils` package provides a `startTestBackend` function +which starts up an entire backend harness, complete with a number of mock +services. You can then provide overrides for services whose behavior you need to +adjust for the test run. The function also accepts a number of _features_ (a +collective term for backend [plugins](../architecture/04-plugins.md) and +[modules](../architecture/06-modules.md)), that are the subjects of the test. + +The function returns an HTTP server instance which can be used together with +e.g. `supertest` to easily test the actual REST service surfaces of plugins who +register routes with [the HTTP router service +API](../core-services/01-index.md). ```ts -import { startTestBackend } from '@backstage/backend-test-utils'; +import { mockServices, startTestBackend } from '@backstage/backend-test-utils'; import request from 'supertest'; +import { myPlugin } from './plugin.ts'; + +describe('myPlugin', () => { + it('can serve values from config', async () => { + const fakeConfig = { myPlugin: { value: 7 } }; -describe('My plugin tests', () => { - it('should return 200', async () => { const { server } = await startTestBackend({ features: [myPlugin()], + services: [mockServices.config.factory({ data: fakeConfig })], }); - const response = await request(server).get('/api/example/hello'); + const response = await request(server).get('/api/example/get-value'); expect(response.status).toBe(200); + expect(response.body).toEqual({ value: 7 }); }); }); ``` + +This example shows how to access the mock service factories and +pass options to them, which will override the default mock services. + +The returned server also has a `port()` method which returns the dynamically +bound listening port. You can use this to perform lower level network +interactions with the running test service. + +## Testing Remote Service Interactions + +If your backend plugin or service interacts with external services using HTTP +calls, we recommend leveraging the `msw` package to intercept actual outgoing +requests and return mock responses. This lets you stub out remote services +rather than the local clients, leading to more thorough and robust tests. You +can read more about how it works [in their documentation](https://mswjs.io/). + +The `@backstage/backend-test-utils` package exports a `setupRequestMockHandlers` +function which ensures that the correct `jest` lifecycle hooks are invoked to +set up and tear down your `msw` instance, and enables the option that completely +rejects requests that don't match one of your mock rules. This ensures that your +tests cannot accidentally leak traffic into production from tests. + +Example: + +```ts +import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; + +describe('read from remote', () => { + const worker = setupServer(); + setupRequestMockHandlers(worker); + + it('should auth and read successfully', async () => { + expect.assertions(1); + + worker.use( + rest.get('https://remote-server.com/api/v3/foo', (req, res, ctx) => { + expect(req.headers.get('authorization')).toBe('Bearer fake'); + return res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.body(JSON.stringify({ value: 7 })), + ); + }), + ); + + // exercise your plugin or service as usual, with real clients + }); +}); +``` + +## Testing Database Interactions + +The `@backstage/backend-test-utils` package includes facilities for testing your +plugins' interactions with databases, including spinning up `testcontainers` +powered Docker images with real database engines to connect to. + +The base setup for such a test could look as follows: + +```ts +// MyDatabaseClass.test.ts +import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; +import { MyDatabaseClass, type FooTableRow } from './MyDatabaseClass'; + +describe('MyDatabaseClass', () => { + // Change this to the set of constants that you actually actively intend to + // support. This create call must be made inside a describe block. Make sure + // to create only one TestDatabases instance per file, since spinning up + // "physical" databases to test against is much costlier than creating the + // "logical" databases within them that the individual tests use. + const databases = TestDatabases.create({ + ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], + }); + + // Just an example of how to conveniently bundle up the setup code + async function createSubject(databaseId: TestDatabaseId) { + const knex = await databases.init(databaseId); + const subject = new MyDatabaseClass({ database: knex }); + await subject.runMigrations(); + return { knex, subject }; + } + + describe('foo', () => { + // Easily run the exact same test onto all supported databases + it.each(databases.eachSupportedId())( + 'should run foo on %p', + async databaseId => { + const { knex, subject } = await createSubject(databaseId); + // raw knex is available for underlying manipulation + await knex('foo').insert({ value: 2 }); + // drive your system under test as usual + await expect(subject.foos()).resolves.toEqual([{ value: 2 }]); + }); + }); +``` + +If you want to pass the test database instance into backend plugins or services, +you can supply it in the form of a mock instance of `coreServices.database` to +your test database. + +```ts +const { knex, subject } = await createSubject(databaseId); +const { server } = await startTestBackend({ + features: [myPlugin()], + services: [[coreServices.database, { getClient: async () => knex }]], +}); +``` + +When running locally, the tests only run against SQLite for the sake of speed. +When the `CI` environment variable is set, all given database engines are used. + +If you do not want or are unable to use docker based database engines, e.g. if +your CI environment is able to supply databases natively, the `TestDatabases` +support custom connection strings through the use of environment variables that +it'll take into account when present. + +- `BACKSTAGE_TEST_DATABASE_POSTGRES13_CONNECTION_STRING` +- `BACKSTAGE_TEST_DATABASE_POSTGRES9_CONNECTION_STRING` +- `BACKSTAGE_TEST_DATABASE_MYSQL8_CONNECTION_STRING` diff --git a/docs/backend-system/core-services/01-index.md b/docs/backend-system/core-services/01-index.md index cb1ec157ae..4ef9d75bde 100644 --- a/docs/backend-system/core-services/01-index.md +++ b/docs/backend-system/core-services/01-index.md @@ -18,6 +18,8 @@ import { coreServices } from '@backstage/backend-plugin-api'; One of the most common services is the HTTP router service which is used to expose HTTP endpoints for other plugins to consume. +### Using the service + The following example shows how to register a HTTP router for the `example` plugin. This single route will be available at the `/api/example/hello` path. @@ -46,9 +48,33 @@ createBackendPlugin({ }); ``` -## Logging and Configuration Service +### Configuring the service -It is common for plugins to need access to configuration values and log messages. +There's additional configuration that you can optionally pass to setup the `httpRouter` core service. + +- `getPath` - Can be used to generate a path for each plugin. Currently defaults to `/api/${pluginId}` + +You can configure these additional options by adding an override for the core service when calling `createBackend` like follows: + +```ts +import { httpRouterFactory } from '@backstage/backend-app-api'; + +const backend = createBackend({ + services: [ + httpRouterFactory({ + getPath: (pluginId: string) => `/plugins/${pluginId}`, + }), + ], +}); +``` + +## Root HTTP Router + +The root HTTP router is a service that allows you to register routes on the root of the backend service. This is useful for things like health checks, or other routes that you want to expose on the root of the backend service. It is used as the base router that backs the `httpRouter` service. Most likely you won't need to use this service directly, but rather use the `httpRouter` service. + +### Using the service + +The following example shows how to get the root HTTP router service in your `example` backend plugin to register a health check route. ```ts import { @@ -62,13 +88,585 @@ createBackendPlugin({ register(env) { env.registerInit({ deps: { - log: coreServices.logger, - config: coreServices.config, + rootHttpRouter: coreServices.rootHttpRouter, }, - async init({ config, log }) { - log.warn('Brace yourself for more log output'); - const url = config.getString('backend.baseUrl'); - log.info(`Backend URL is running on ${url}`); + async init({ rootHttpRouter }) { + const router = Router(); + router.get('/health', (request, response) => { + response.send('OK'); + }); + + rootHttpRouter.use(router); + }, + }); + }, +}); +``` + +### Configuring the service + +There's additional options that you can pass to configure the root HTTP Router service. These options are passed when you call `createBackend`. + +- `indexPath` - optional path to forward all unmatched requests to. Defaults to `/api/app` which is the `app-backend` plugin responsible for serving the frontend application through the backend. + +- `configure` - this is an optional function that you can use to configure the `express` instance. This is useful if you want to add your own middleware to the root router, such as logging, or other things that you want to do before the request is handled by the backend. It's also useful to override the order in which middleware is applied. + +You can configure the root HTTP Router service by passing the options to the `createBackend` function. + +```ts +import { rootHttpRouterFactory } from '@backstage/backend-app-api'; + +const backend = createBackend({ + services: [ + rootHttpRouterFactory({ + configure: ({ app, middleware, routes, config, logger, lifecycle }) => { + // the built in middleware is provided through an option in the configure function + app.use(middleware.helmet()); + app.use(middleware.cors()); + app.use(middleware.compression()); + + // you can add you your own middleware in here + app.use(custom.logging()); + + // here the routes that are registered by other plugins + app.use(routes); + + // some other middleware that comes after the other routes + app.use(middleware.notFound()); + app.use(middleware.error()); + }, + }), + ], +}); +``` + +## Config + +This service allows you to read configuration values out of your `app-config` YAML files. + +### Using the service + +The following example shows how you can use the default config service to be able to get a config value, and then log it to the console. + +```ts +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; + +createBackendPlugin({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + log: coreServices.logger, + config: coreServices.config, + }, + async init({ log, config }) { + const baseUrl = config.getString('backend.baseUrl'); + log.warn(`The backend is running at ${baseUrl}`); + }, + }); + }, +}); +``` + +### Configuring the service + +There's additional configuration that you can optionally pass to setup the `config` core service. + +- `argv` - Override the arguments that are passed to the config loader, instead of using `process.argv` +- `remote` - Configure remote configuration loading + +You can configure these additional options by adding an override for the core service when calling `createBackend` like follows: + +```ts +import { configFactory } from '@backstage/backend-app-api'; + +const backend = createBackend({ + services: [ + configFactory({ + argv: [ + '--config', + '/backstage/app-config.development.yaml', + '--config', + '/backstage/app-config.yaml', + ], + remote: { reloadIntervalSeconds: 60 }, + }), + ], +}); +``` + +## Logging + +This service allows plugins to output logging information. There are actually two logger services: a root logger, and a plugin logger which is bound to individual plugins, so that you will get nice messages with the plugin ID referenced in the log lines. + +### Using the service + +The following example shows how to get the logger in your `example` backend plugin and create a warning message that will be printed nicely to the console. + +```ts +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; + +createBackendPlugin({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + log: coreServices.logger, + }, + async init({ log }) { + log.warn("Here's a nice log line that's a warning!"); + }, + }); + }, +}); +``` + +### Root Logger + +The root logger is the logger that is used by other root services. It's where the implementation lies for creating child loggers around the backstage ecosystem including child loggers for plugins with the correct metadata and annotations. + +If you want to override the implementation for logging across all of the backend, this is the service that you should override. + +### Configuring the service + +The following example is how you can override the root logger service to add additional metadata to all log lines. + +```ts +import { coreServices } from '@backstage/backend-plugin-api'; +import { WinstonLogger } from '@backstage/backend-app-api'; + +const backend = createBackend({ + services: [ + createServiceFactory({ + service: coreServices.rootLogger, + deps: { + config: coreServices.config, + }, + async factory({ config }) { + const logger = WinstonLogger.create({ + meta: { + service: 'backstage', + // here's some additional information that is not part of the + // original implementation + podName: 'myk8spod', + }, + level: process.env.LOG_LEVEL || 'info', + format: + process.env.NODE_ENV === 'production' + ? format.json() + : WinstonLogger.colorFormat(), + transports: [new transports.Console()], + }); + + return logger; + }, + }), + ], +}); +``` + +## Cache + +This service lets your plugin interact with a cache. It is bound to your plugin too, so that you will only set and get values in your plugin's private namespace. + +### Using the service + +The following example shows how to get a cache client in your `example` backend plugin and setting and getting values from the cache. + +```ts +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; + +createBackendPlugin({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + cache: coreServices.cache, + }, + async init({ cache }) { + const { key, value } = { key: 'test:key', value: 'bob' }; + await cache.set(key, value, { ttl: 1000 }); + + // .. some other stuff. + + await cache.get(key); // 'bob' + }, + }); + }, +}); +``` + +## Database + +This service lets your plugins get a `knex` client hooked up to a database which is configured in your `app-config` YAML files, for your persistence needs. + +If there's no config provided in `backend.database` then you will automatically get a simple in-memory SQLite 3 database for your plugin whose contents will be lost when the service restarts. + +This service is scoped per plugin too, so that table names do not conflict across plugins. + +### Using the service + +The following example shows how to get access to the database service in your `example` backend plugin and getting a client for interacting with the database. It also runs some migrations from a certain directory for your plugin. + +```ts +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { resolvePackagePath } from '@backstage/backend-common'; + +createBackendPlugin({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + database: coreServices.database, + }, + async init({ database }) { + const client = await database.getClient(); + const migrationsDir = resolvePackagePath( + '@internal/my-plugin', + 'migrations', + ); + if (!database.migrations?.skip) { + await client.migrate.latest({ + directory: migrationsDir, + }); + } + }, + }); + }, +}); +``` + +## Discovery + +When building plugins, you might find that you will need to look up another plugin's base URL to be able to communicate with it. This could be for example an HTTP route or some `ws` protocol URL. For this we have a discovery service which can provide both internal and external base URLs for a given a plugin ID. + +### Using the service + +The following example shows how to get the discovery service in your `example` backend plugin and making a request to both the internal and external base URLs for the `derp` plugin. + +```ts +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { fetch } from 'node-fetch'; + +createBackendPlugin({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + discovery: coreServices.discovery, + }, + async init({ discovery }) { + const url = await discoverty.getBaseUrl('derp'); // can also use discovery.getBaseUrl to retrieve external URL + const response = await fetch(`${url}/hello`); + }, + }); + }, +}); +``` + +## Identity + +When working with backend plugins, you might find that you will need to interact with the `auth-backend` plugin to both authenticate backstage tokens, and to deconstruct them to get the user's entity ref and/or ownership claims out of them. + +### Using the service + +The following example shows how to get the identity service in your `example` backend plugin and retrieve the user's entity ref and ownership claims for the incoming request. + +```ts +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { Router } from 'express'; + +createBackendPlugin({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + identity: coreServices.identity, + http: coreServices.httpRouter, + }, + async init({ http, identity }) { + const router = Router(); + router.get('/test-me', (request, response) => { + // use the identity service to pull out the header from the request and get the user + const { + identity: { userEntityRef, ownershipEntityRefs }, + } = await identity.getIdentity({ + request, + }); + + // send the decoded and validated things back to the user + response.json({ + userEntityRef, + ownershipEntityRefs, + }); + }); + + http.use(router); + }, + }); + }, +}); +``` + +### Configuring the service + +There's additional configuration that you can optionally pass to setup the `identity` core service. + +- `issuer` - Set an optional issuer for validation of the JWT token +- `algorithms` - `alg` header for validation of the JWT token, defaults to `ES256`. More info on supported algorithms can be found in the [`jose` library documentation](https://github.com/panva/jose) + +You can configure these additional options by adding an override for the core service when calling `createBackend` like follows: + +```ts +import { identityFactory } from '@backstage/backend-app-api'; + +const backend = createBackend({ + services: [ + identityFactory({ + issuer: 'backstage', + algorithms: ['ES256', 'RS256'], + }), + ], +}); +``` + +## Lifecycle + +This service allows your plugins to register hooks for cleaning up resources as the service is shutting down (e.g. when a pod is being torn down, or when pressing `Ctrl+C` during local development). Other core services also leverage this same mechanism internally to stop themselves cleanly. + +### Using the service + +The following example shows how to get the lifecycle service in your `example` backend plugin to clean up a long running interval when the service is shutting down. + +```ts +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; + +createBackendPlugin({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + lifecycle: coreServices.lifecycle, + logger: coreServices.logger, + }, + async init({ lifecycle, logger }) { + // some example work that we want to stop when shutting down + const interval = setInterval(async () => { + await fetch('http://google.com/keepalive').then(r => r.json()); + // do some other stuff. + }, 1000); + + lifecycle.addShutdownHook({ + fn: () => clearInterval(interval), + logger, + }); + }, + }); + }, +}); +``` + +## Root Lifecycle + +This service is the same as the lifecycle service, but should only be used by the root services. This is also where the implementation for the actual lifecycle hooks are collected and executed, so if you want to override the implementation of how those are processed, you should override this service. + +### Configure the service + +The following example shows how to override the default implementation of the lifecycle service with something that listens on different process events to the original. + +```ts +class MyCustomLifecycleService implements RootLifecycleService { + constructor(private readonly logger: LoggerService) { + ['SIGKILL', 'SIGTERM'].map(signal => + process.on(signal, () => this.shutdown()), + ); + } + + #isCalled = false; + #shutdownTasks: Array = []; + + addShutdownHook(options: LifecycleServiceShutdownHook): void { + this.#shutdownTasks.push(options); + } + + async shutdown(): Promise { + if (this.#isCalled) { + return; + } + this.#isCalled = true; + + this.logger.info(`Running ${this.#shutdownTasks.length} shutdown tasks...`); + await Promise.all( + this.#shutdownTasks.map(async hook => { + const { logger = this.logger } = hook; + try { + await hook.fn(); + logger.info(`Shutdown hook succeeded`); + } catch (error) { + logger.error(`Shutdown hook failed, ${error}`); + } + }), + ); + } +} + +const backend = createBackend({ + services: [ + createServiceFactory({ + service: coreServices.rootLifecycle, + deps: { + logger: coreServices.rootLogger, + }, + async factory({ logger }) { + return new MyCustomLifecycleService(logger); + }, + }), + ], +}); +``` + +## Permissions + +This service allows your plugins to ask [the permissions framework](https://backstage.io/docs/permissions/overview) for authorization of user actions. + +### Using the service + +The following example shows how to get the permissions service in your `example` backend to check to see if the user is allowed to perform a certain action with a custom permission rule. + +```ts +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { Router } from 'express'; + +createBackendPlugin({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + permissions: coreServices.permissions, + http: coreServices.httpRouter, + }, + async init({ permissions, http }) { + const router = Router(); + router.get('/test-me', (request, response) => { + // use the identity service to pull out the token from request headers + const { token } = await identity.getIdentity({ + request, + }); + + // ask the permissions framework what the decision is for the permission + const permissionResponse = await permissions.authorize( + [ + { + permission: myCustomPermission, + }, + ], + { token }, + ); + }); + + http.use(router); + }, + }); + }, +}); +``` + +## Scheduler + +When writing plugins, you sometimes want to have things running on a schedule, or something similar to cron jobs that are distributed through instances that your backend plugin is running on. We supply a task scheduler for this purpose that is scoped per plugin so that you can create these tasks and orchestrate their execution. + +### Using the service + +The following example shows how to get the scheduler service in your `example` backend to issue a scheduled task that runs across your instances at a given interval. + +```ts +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { fetch } from 'node-fetch'; + +createBackendPlugin({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + scheduler: coreServices.scheduler, + }, + async init({ scheduler }) { + await scheduler.scheduleTask({ + frequency: { minutes: 10 }, + timeout: { seconds: 30 }, + id: 'ping-google', + fn: async () => { + await fetch('http://google.com/ping'); + }, + }); + }, + }); + }, +}); +``` + +## URL Readers + +Plugins will require communication with certain integrations that users have configured. Popular integrations are things like Version Control Systems (VSC), such as GitHub, BitBucket GitLab etc. These integrations are configured in the `integrations` section of the `app-config.yaml` file. + +These URL readers are basically wrappers with authentication for files and folders that could be stored in these VCS repositories. + +### Using the service + +The following example shows how to get the URL Reader service in your `example` backend plugin to read a file and a directory from a GitHub repository. + +```ts +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import os from 'os'; + +createBackendPlugin({ + id: 'example', + register(env) { + env.registerInit({ + deps: { + urlReader: coreServices.urlReader, + }, + async init({ urlReader }) { + const buffer = await urlReader + .read('https://github.com/backstage/backstage/blob/master/README.md') + .then(r => r.buffer()); + + const tmpDir = os.tmpdir(); + const directory = await urlReader + .readTree( + 'https://github.com/backstage/backstage/tree/master/packages/backend', + ) + .then(tree => tree.dir({ targetDir: tmpDir })); }, }); }, diff --git a/docs/features/kubernetes/configuration.md b/docs/features/kubernetes/configuration.md index 41d72b2be2..837574aa9e 100644 --- a/docs/features/kubernetes/configuration.md +++ b/docs/features/kubernetes/configuration.md @@ -402,6 +402,41 @@ view the Kubernetes API docs for your Kubernetes version (e.g. [API Groups for v1.22](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#-strong-api-groups-strong-) ) +### `objectTypes` (optional) + +Overrides for the Kubernetes object types fetched from the cluster. The default object types are: + +- pods +- services +- configmaps +- limitranges +- deployments +- replicasets +- horizontalpodautoscalers +- jobs +- cronjobs +- ingresses +- statefulsets +- daemonsets + +You may use this config to override the default object types if you only want a subset of +the default ones. However, it's currently not supported to fetch object types other +than the ones specified in the default types. + +Example: + +```yaml +--- +kubernetes: + objectTypes: + - configmaps + - deployments + - limitranges + - pods + - services + - statefulsets +``` + ### Role Based Access Control The current RBAC permissions required are read-only cluster wide, the below @@ -441,6 +476,13 @@ rules: - get - list - watch + - apiGroups: + - metrics.k8s.io + resources: + - pods + verbs: + - get + - list ``` ## Surfacing your Kubernetes components as part of an entity diff --git a/docs/features/search/how-to-guides.md b/docs/features/search/how-to-guides.md index 7267e9fd5b..eb162ce527 100644 --- a/docs/features/search/how-to-guides.md +++ b/docs/features/search/how-to-guides.md @@ -114,6 +114,42 @@ of the `SearchType` component. > Check out the documentation around [integrating search into plugins](../../plugins/integrating-search-into-plugins.md#create-a-collator) for how to create your own collator. +## How to customize fields in the Software Catalog index + +Sometimes you will might want to have ability to control +which data passes to search index in catalog collator, or to customize data for specific kind. +You can easily do that by passing `entityTransformer` callback to `DefaultCatalogCollatorFactory`. +You can either just simply amend default behaviour, or even to write completely new document +(which should follow some required basic structure though). + +> `authorization` and `location` cannot be modified via a `entityTransformer`, `location` can be modified only through `locationTemplate`. + +```diff +// packages/backend/src/plugins/search.ts + +const entityTransformer: CatalogCollatorEntityTransformer = (entity: Entity) => { + if (entity.kind === 'SomeKind') { + return { + // customize here output for 'SomeKind' kind + }; + } + + return { + // and customize default output + ...defaultCatalogCollatorEntityTransformer(entity), + text: 'my super cool text', + }; +}; + +indexBuilder.addCollator({ + collator: DefaultCatalogCollatorFactory.fromConfig(env.config, { + discovery: env.discovery, + tokenManager: env.tokenManager, ++ entityTransformer, + }), +}); +``` + ## How to limit what can be searched in the Software Catalog The Software Catalog includes a wealth of information about the components, diff --git a/docs/getting-started/configure-app-with-plugins.md b/docs/getting-started/configure-app-with-plugins.md index 1bfabc335c..ebe98f9ddc 100644 --- a/docs/getting-started/configure-app-with-plugins.md +++ b/docs/getting-started/configure-app-with-plugins.md @@ -12,56 +12,63 @@ infrastructure needs - CI/CD, monitoring, auditing, and more. The following steps assume that you have [created a Backstage app](./create-an-app.md) and want to add an existing plugin -to it. We are using the +to it. + +We are using the [CircleCI](https://github.com/backstage/backstage/blob/master/plugins/circleci/README.md) -plugin in this example. +plugin in this example, which is designed to show CI/CD pipeline information attached +to an entity in the software catalog. 1. Add the plugin's npm package to the repo: -```bash -yarn workspace app add @backstage/plugin-circleci -``` + ```bash + yarn workspace app add @backstage/plugin-circleci + ``` -Note the plugin is added to the `app` package, rather than the root -package.json. Backstage Apps are set up as monorepos with -[yarn workspaces](https://classic.yarnpkg.com/en/docs/workspaces/). Since -CircleCI is a frontend UI plugin, it goes in `app` rather than `backend`. + Note the plugin is added to the `app` package, rather than the root + `package.json`. Backstage Apps are set up as monorepos with + [Yarn workspaces](https://classic.yarnpkg.com/en/docs/workspaces/). Since + CircleCI is a frontend UI plugin, it goes in `app` rather than `backend`. 2. Add the `EntityCircleCIContent` extension to the entity pages in the app: -```diff - // packages/app/src/components/catalog/EntityPage.tsx -+import { -+ EntityCircleCIContent, -+ isCircleCIAvailable, -+} from '@backstage/plugin-circleci'; + ```diff + // packages/app/src/components/catalog/EntityPage.tsx + +import { + + EntityCircleCIContent, + + isCircleCIAvailable, + +} from '@backstage/plugin-circleci'; -... - const cicdContent = ( - - ... -+ -+ -+ ; - - ); -``` + ... + const cicdContent = ( + + ... + + + + + + ; + + ); + ``` -This is just one example, but each Backstage instance may integrate content or -cards to suit their needs on different pages, tabs, etc. Note that stand-alone -plugins that are not "attached" to the Software Catalog would be added outside -the `EntityPage`. + This is just one example, but each Backstage instance may integrate content or + cards to suit their needs on different pages, tabs, etc. In addition, while some + plugins such as this example are designed to annotate or support specific software + catalog entities, others may be intended to be used in a stand-alone fashion and + would be added outside the `EntityPage`, such as being added to the main navigation. -4. [Optional] Add proxy config: +3. _[Optional]_ Add a proxy config: -```yaml -// app-config.yaml -proxy: - '/circleci/api': - target: https://circleci.com/api/v1.1 - headers: - Circle-Token: ${CIRCLECI_AUTH_TOKEN} -``` + Plugins that collect data off of external services may require the use of a proxy service. + This plugin accesses the CircleCI REST API, and thus requires a proxy definition. + + ```yaml + // app-config.yaml + proxy: + '/circleci/api': + target: https://circleci.com/api/v1.1 + headers: + Circle-Token: ${CIRCLECI_AUTH_TOKEN} + ``` ### Adding a plugin page to the Sidebar diff --git a/docs/plugins/create-a-plugin.md b/docs/plugins/create-a-plugin.md index da7cf0051a..cbd789c757 100644 --- a/docs/plugins/create-a-plugin.md +++ b/docs/plugins/create-a-plugin.md @@ -33,7 +33,7 @@ You can also serve the plugin in isolation by running `yarn start` in the plugin directory. Or by using the yarn workspace command, for example: ```bash -yarn workspace @backstage/my-plugin start # Also supports --check +yarn workspace @backstage/plugin-my-plugin start # Also supports --check ``` This method of serving the plugin provides quicker iteration speed and a faster diff --git a/docs/plugins/feature-flags.md b/docs/plugins/feature-flags.md index d9841598bb..a572143d6e 100644 --- a/docs/plugins/feature-flags.md +++ b/docs/plugins/feature-flags.md @@ -56,7 +56,7 @@ The users selection is saved in the users browsers local storage. Once toggled i The easiest way to control content based on the state of a feature flag is to use the [FeatureFlagged](https://backstage.io/docs/reference/core-app-api.featureflagged) component. ```ts -import { FeatureFlagged } from '@backstage/core-app-api' +import { FeatureFlagged } from '@backstage/core-app-api'; ... diff --git a/docs/releases/v1.11.0-next.0-changelog.md b/docs/releases/v1.11.0-next.0-changelog.md new file mode 100644 index 0000000000..2934e8054e --- /dev/null +++ b/docs/releases/v1.11.0-next.0-changelog.md @@ -0,0 +1,1429 @@ +# Release v1.11.0-next.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.2.0-next.0 + +### Minor Changes + +- 1ba120faa3: Added new mechanism to handle deltas in incremental providers + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-test-utils@0.1.34-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + +## @backstage/plugin-catalog-react@1.3.0-next.0 + +### Minor Changes + +- 929e1afe1b: Add `initialFilter` prop to EntityLifecyclePicker. This allows you to set an initial lifecycle for the catalog. + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + +## @backstage/plugin-kubernetes-common@0.6.0-next.0 + +### Minor Changes + +- 1728c1ef01: **BREAKING**: Renamed misspelled `LimitRangeFetchReponse` to `LimitRangeFetchResponse`. + +### Patch Changes + +- 2518ef5b8a: New K8s catalog entity annotations added that will replace now deprecated k8s annotations in the catalog-model package. K8s annotation imports should now be made from plugin-kubernetes-common. +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-scaffolder@1.11.0-next.0 + +### Minor Changes + +- d6bb12a2e7: - **Deprecation** - Deprecated the following exports, please import them directly from `@backstage/plugin-scaffolder-react` instead + + createScaffolderLayout + ScaffolderLayouts + LayoutOptions + LayoutTemplate + +- 8c2966536b: Embed scaffolder workflow in other components + +### Patch Changes + +- cbab8ac107: lock versions of `@rjsf/*-beta` packages +- d2ddde2108: Add `ScaffolderLayouts` to `NextScaffolderPage` +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + - @backstage/integration-react@1.1.9 + +## @backstage/plugin-scaffolder-backend@1.11.0-next.0 + +### Minor Changes + +- 0b2952ee4b: Added the option to overwrite files in the `targetPath` of the `template:fetch` action + +### Patch Changes + +- ad3edc402d: **Deprecations**: The following are deprecated and should instead be imported from the new package `@backstage/plugin-scaffolder-node`: + + - `ActionContext` + - `createTemplateAction` + - `TaskSecrets` + - `TemplateAction` + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/plugin-scaffolder-node@0.1.0-next.0 + +### Minor Changes + +- d72866f0cc: New package that takes over some of the types and functionality from `@backstage/plugin-scaffolder-backend` that are shared with other modules + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/plugin-scaffolder-react@1.1.0-next.0 + +### Minor Changes + +- 8c2966536b: Embed scaffolder workflow in other components + +### Patch Changes + +- cbab8ac107: lock versions of `@rjsf/*-beta` packages +- d2ddde2108: Add `ScaffolderLayouts` to `NextScaffolderPage` +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + +## @backstage/backend-app-api@0.3.2-next.0 + +### Patch Changes + +- a18da2f8b5: Fixed an issue were the log redaction didn't properly escape RegExp characters. +- ed8b5967d7: `HttpRouterFactoryOptions.getPath` is now optional as a default value is always provided in the factory. +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/plugin-permission-node@0.7.5-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/backend-common@0.18.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.3.2-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/backend-defaults@0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.3.2-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/backend-plugin-api@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + +## @backstage/backend-tasks@0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/backend-test-utils@0.1.34-next.0 + +### Patch Changes + +- d0901c9ba4: All mock service factories and mock service implementations are now available via the new experimental `mockServices` export. +- Updated dependencies + - @backstage/backend-app-api@0.3.2-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/cli@0.22.1 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/catalog-client@1.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/catalog-model@1.1.6-next.0 + +### Patch Changes + +- 2518ef5b8a: Add deprecation tag to kubernetes constants in catalog, constants are now defined in plugin-kubernetes-common + +## @backstage/create-app@0.4.37-next.0 + +### Patch Changes + +- Bumped create-app version. + +## @backstage/dev-utils@1.0.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/integration-react@1.1.9 + +## @techdocs/cli@1.3.2-next.0 + +### Patch Changes + +- 6e0b6a0d50: Fixed publish command missing awsBucketRootPath option. + Fixed publish command having the gcsBucketRootPath option misconfigured, previously returning a boolean vs a string. +- Updated dependencies + - @backstage/plugin-techdocs-node@1.4.6-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-adr@0.3.1-next.0 + +### Patch Changes + +- 496cf6aff0: Render the common `` component when the `backstage.io/adr-location` annotation is missing from the component +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-adr-common@0.2.6-next.0 + - @backstage/integration-react@1.1.9 + +## @backstage/plugin-adr-backend@0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-adr-common@0.2.6-next.0 + +## @backstage/plugin-adr-common@0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-airbrake@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/dev-utils@1.0.12-next.0 + +## @backstage/plugin-airbrake-backend@0.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-allure@0.1.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-api-docs@0.8.15-next.0 + +### Patch Changes + +- 60996f8aba: Updating the readme with better `csp` instructions +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-catalog@1.7.3-next.0 + +## @backstage/plugin-app-backend@0.3.42-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/plugin-auth-backend@0.17.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + +## @backstage/plugin-auth-node@0.2.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-azure-devops@0.2.6-next.0 + +### Patch Changes + +- 347b16ecea: Fixed `AssignedToCurrentUsersTeams` & `CreatedByCurrentUsersTeams` filter in `AzurePullRequestsPage` component. +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-azure-devops-backend@0.3.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-azure-sites@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-azure-sites-backend@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-badges@0.2.39-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-badges-backend@0.1.36-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + +## @backstage/plugin-bazaar@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-catalog@1.7.3-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/cli@0.22.1 + +## @backstage/plugin-bazaar-backend@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.34-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + +## @backstage/plugin-bitrise@0.1.42-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-catalog@1.7.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/integration-react@1.1.9 + +## @backstage/plugin-catalog-backend@1.7.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + - @backstage/plugin-permission-node@0.7.5-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.1.15-next.0 + +### Patch Changes + +- 8e025f1347: Added support for `externalId` when assuming role in `AwsS3EntityProvider` +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/plugin-catalog-backend-module-azure@0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + +## @backstage/plugin-catalog-backend-module-msgraph@0.4.8-next.0 + +### Patch Changes + +- 0daa328c3a: Extract default transformers to their own file +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + +## @backstage/plugin-catalog-common@1.0.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-catalog-graph@0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + +## @backstage/plugin-catalog-graphql@0.3.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-catalog-import@0.9.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/integration-react@1.1.9 + +## @backstage/plugin-catalog-node@1.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/plugin-cicd-statistics@0.1.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-cicd-statistics@0.1.17-next.0 + +## @backstage/plugin-circleci@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-cloudbuild@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-code-climate@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-code-coverage@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-code-coverage-backend@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + +## @backstage/plugin-cost-insights@0.12.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-dynatrace@2.0.0-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-events-backend@0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + +## @backstage/plugin-events-backend-module-aws-sqs@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + +## @backstage/plugin-events-backend-module-azure@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + +## @backstage/plugin-events-backend-module-gerrit@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + +## @backstage/plugin-events-backend-module-github@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + +## @backstage/plugin-events-backend-module-gitlab@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + +## @backstage/plugin-events-backend-test-utils@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.3-next.0 + +## @backstage/plugin-events-node@0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.0 + +## @backstage/plugin-explore@0.3.46-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-explore-react@0.0.25 + +## @backstage/plugin-explore-backend@0.0.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-firehydrant@0.1.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + +## @backstage/plugin-fossa@0.2.47-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-github-actions@0.5.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-github-deployments@0.1.46-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/integration-react@1.1.9 + +## @backstage/plugin-github-issues@0.2.4-next.0 + +### Patch Changes + +- 3f88ae9d0a: Updated README.md examples to use correct components and fixed some syntax errors. +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-github-pull-requests-board@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-gocd@0.1.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-graphql-backend@0.1.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-graphql@0.3.18-next.0 + +## @backstage/plugin-home@0.4.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-stack-overflow@0.1.11-next.0 + +## @backstage/plugin-ilert@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-jenkins@0.7.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-jenkins-common@0.1.13-next.0 + +## @backstage/plugin-jenkins-backend@0.1.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/plugin-jenkins-common@0.1.13-next.0 + +## @backstage/plugin-jenkins-common@0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.11-next.0 + +## @backstage/plugin-kafka@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-kafka-backend@0.2.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-kubernetes@0.7.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-kubernetes-backend@0.9.3-next.0 + +### Patch Changes + +- 2518ef5b8a: Adding new Cluster detail fields to catalogClusterLocator. Replace deprecated imports with k8s annotations from plugin-kubernetes-common. +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-test-utils@0.1.34-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + +## @backstage/plugin-lighthouse@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-newrelic-dashboard@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-org@0.6.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-org-react@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + +## @backstage/plugin-pagerduty@0.5.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-periskop@0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-periskop-backend@0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-permission-backend@0.5.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/plugin-permission-node@0.7.5-next.0 + +## @backstage/plugin-permission-node@0.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + +## @backstage/plugin-playlist@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + +## @backstage/plugin-playlist-backend@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-test-utils@0.1.34-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/plugin-permission-node@0.7.5-next.0 + +## @backstage/plugin-proxy-backend@0.2.36-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-rollbar@0.4.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-rollbar-backend@0.1.39-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.17-next.0 + +### Patch Changes + +- d72866f0cc: Internal refactor to use the new `@backstage/plugin-scaffolder-node` package for some functionality +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.0-next.0 + - @backstage/plugin-scaffolder-backend@1.11.0-next.0 + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.10-next.0 + +### Patch Changes + +- d72866f0cc: Internal refactor to use the new `@backstage/plugin-scaffolder-node` package for some functionality +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.0-next.0 + - @backstage/plugin-scaffolder-backend@1.11.0-next.0 + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.2-next.0 + +### Patch Changes + +- d72866f0cc: Internal refactor to use the new `@backstage/plugin-scaffolder-node` package for some functionality +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.0-next.0 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.15-next.0 + +### Patch Changes + +- d72866f0cc: Internal refactor to use the new `@backstage/plugin-scaffolder-node` package for some functionality +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.0-next.0 + +## @backstage/plugin-scaffolder-common@1.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-search@1.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-search-backend@1.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/plugin-permission-node@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.1.3-next.0 + +## @backstage/plugin-search-backend-module-elasticsearch@1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@1.1.3-next.0 + +## @backstage/plugin-search-backend-module-pg@0.5.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-search-backend-node@1.1.3-next.0 + +## @backstage/plugin-search-backend-node@1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + +## @backstage/plugin-sentry@0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-sonarqube@0.6.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-sonarqube-react@0.1.2-next.0 + +## @backstage/plugin-sonarqube-backend@0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-sonarqube-react@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-splunk-on-call@0.4.4-next.0 + +### Patch Changes + +- 3598136ac7: Refactor plugin Card component to not rerender contents unnecessarily. +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-stack-overflow@0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.4.31-next.0 + +## @backstage/plugin-stack-overflow-backend@0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-tech-insights@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-tech-insights-backend@0.5.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/plugin-tech-insights-node@0.3.10-next.0 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26-next.0 + +### Patch Changes + +- d6b912f963: Surface the cause of the json rules engine +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-tech-insights-node@0.3.10-next.0 + +## @backstage/plugin-tech-insights-node@0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + +## @backstage/plugin-techdocs@1.4.4-next.0 + +### Patch Changes + +- c8e09cc383: Fixed bug in Techdocs reader where a techdocs page with a hash in the URL did not always jump to the document anchor. +- cad5607411: Improve view: remove footer overlay on large screen +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-techdocs-react@1.1.3-next.0 + - @backstage/integration-react@1.1.9 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.4.4-next.0 + - @backstage/plugin-catalog@1.7.3-next.0 + - @backstage/plugin-techdocs-react@1.1.3-next.0 + - @backstage/integration-react@1.1.9 + +## @backstage/plugin-techdocs-backend@1.5.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.4.6-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.1.3-next.0 + - @backstage/integration-react@1.1.9 + +## @backstage/plugin-techdocs-node@1.4.6-next.0 + +### Patch Changes + +- 87ab76e55c: Fixed bug caused by recent migration to AWS SDK V3 for techdocs-node. Instead of s3ForcePathStyle, forcePathStyle should be passed. +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + +## @backstage/plugin-techdocs-react@1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-todo@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-todo-backend@0.1.39-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + +## @backstage/plugin-user-settings@0.6.3-next.0 + +### Patch Changes + +- c4940b6322: Added a message to advise a page reload when toggling feature flags +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + +## @backstage/plugin-user-settings-backend@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + +## @backstage/plugin-vault@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + +## @backstage/plugin-vault-backend@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.34-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + +## example-app@0.2.80-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-azure-devops@0.2.6-next.0 + - @backstage/plugin-scaffolder-react@1.1.0-next.0 + - @backstage/plugin-scaffolder@1.11.0-next.0 + - @backstage/plugin-api-docs@0.8.15-next.0 + - @backstage/plugin-techdocs@1.4.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/plugin-user-settings@0.6.3-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-kubernetes@0.7.8-next.0 + - @backstage/plugin-airbrake@0.3.15-next.0 + - @backstage/plugin-azure-sites@0.1.4-next.0 + - @backstage/plugin-badges@0.2.39-next.0 + - @internal/plugin-catalog-customized@0.0.7-next.0 + - @backstage/plugin-catalog-graph@0.2.27-next.0 + - @backstage/plugin-catalog-import@0.9.5-next.0 + - @backstage/plugin-circleci@0.3.15-next.0 + - @backstage/plugin-cloudbuild@0.3.15-next.0 + - @backstage/plugin-code-coverage@0.2.8-next.0 + - @backstage/plugin-cost-insights@0.12.4-next.0 + - @backstage/plugin-dynatrace@2.0.0-next.0 + - @backstage/plugin-explore@0.3.46-next.0 + - @backstage/plugin-github-actions@0.5.15-next.0 + - @backstage/plugin-gocd@0.1.21-next.0 + - @backstage/plugin-home@0.4.31-next.0 + - @backstage/plugin-jenkins@0.7.14-next.0 + - @backstage/plugin-kafka@0.3.15-next.0 + - @backstage/plugin-lighthouse@0.3.15-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.8-next.0 + - @backstage/plugin-org@0.6.5-next.0 + - @backstage/plugin-pagerduty@0.5.8-next.0 + - @backstage/plugin-playlist@0.1.6-next.0 + - @backstage/plugin-rollbar@0.4.15-next.0 + - @backstage/plugin-search@1.0.8-next.0 + - @backstage/plugin-sentry@0.4.8-next.0 + - @backstage/plugin-tech-insights@0.3.7-next.0 + - @backstage/plugin-todo@0.2.17-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-techdocs-react@1.1.3-next.0 + - @backstage/cli@0.22.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.10-next.0 + - @backstage/integration-react@1.1.9 + - @backstage/plugin-apache-airflow@0.2.7 + - @backstage/plugin-gcalendar@0.3.10 + - @backstage/plugin-gcp-projects@0.3.33 + - @backstage/plugin-graphiql@0.2.46 + - @backstage/plugin-newrelic@0.3.32 + - @backstage/plugin-shortcuts@0.3.6 + - @backstage/plugin-stack-overflow@0.1.11-next.0 + - @backstage/plugin-tech-radar@0.6.0 + +## example-backend@0.2.80-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.9.3-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.10-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26-next.0 + - @backstage/plugin-scaffolder-backend@1.11.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - example-app@0.2.80-next.0 + - @backstage/plugin-techdocs-backend@1.5.3-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-app-backend@0.3.42-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-adr-backend@0.2.7-next.0 + - @backstage/plugin-auth-backend@0.17.5-next.0 + - @backstage/plugin-badges-backend@0.1.36-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/plugin-code-coverage-backend@0.2.8-next.0 + - @backstage/plugin-jenkins-backend@0.1.32-next.0 + - @backstage/plugin-kafka-backend@0.2.35-next.0 + - @backstage/plugin-playlist-backend@0.2.5-next.0 + - @backstage/plugin-tech-insights-backend@0.5.8-next.0 + - @backstage/plugin-todo-backend@0.1.39-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/plugin-events-backend@0.2.3-next.0 + - @backstage/plugin-permission-node@0.7.5-next.0 + - @backstage/plugin-rollbar-backend@0.1.39-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.3-next.0 + - @backstage/plugin-azure-devops-backend@0.3.21-next.0 + - @backstage/plugin-azure-sites-backend@0.1.4-next.0 + - @backstage/plugin-explore-backend@0.0.4-next.0 + - @backstage/plugin-graphql-backend@0.1.32-next.0 + - @backstage/plugin-permission-backend@0.5.17-next.0 + - @backstage/plugin-proxy-backend@0.2.36-next.0 + - @backstage/plugin-search-backend@1.2.3-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.3-next.0 + - @backstage/plugin-search-backend-node@1.1.3-next.0 + - @backstage/plugin-tech-insights-node@0.3.10-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + +## example-backend-next@0.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.11.0-next.0 + - @backstage/backend-defaults@0.1.7-next.0 + - @backstage/plugin-app-backend@0.3.42-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + +## techdocs-cli-embedded-app@0.2.79-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.4.4-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-catalog@1.7.3-next.0 + - @backstage/plugin-techdocs-react@1.1.3-next.0 + - @backstage/cli@0.22.1 + - @backstage/integration-react@1.1.9 + +## @internal/plugin-catalog-customized@0.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/plugin-catalog@1.7.3-next.0 + +## @internal/plugin-todo-list-backend@1.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 diff --git a/microsite-next/yarn.lock b/microsite-next/yarn.lock index 3a632b3079..5f27b0f062 100644 --- a/microsite-next/yarn.lock +++ b/microsite-next/yarn.lock @@ -10093,9 +10093,9 @@ __metadata: linkType: hard "ua-parser-js@npm:^0.7.30": - version: 0.7.32 - resolution: "ua-parser-js@npm:0.7.32" - checksum: 6b6b035dd78a0ab3369f166ab6f26225d823d83630788806d634f16259297a8f4ae6fe0be4e48f4353ac10dffded3971d7745c55d1432fdfc78a893ba58ef044 + version: 0.7.33 + resolution: "ua-parser-js@npm:0.7.33" + checksum: 1510e9ec26fcaf0d8c6ae8f1078a8230e8816f083e1b5f453ea19d06b8ef2b8a596601c92148fd41899e8b3e5f83fa69c42332bd5729b931a721040339831696 languageName: node linkType: hard diff --git a/microsite/data/plugins/backstage-search-platform.yaml b/microsite/data/plugins/backstage-search-platform.yaml index 5a313ae9da..33faaba310 100644 --- a/microsite/data/plugins/backstage-search-platform.yaml +++ b/microsite/data/plugins/backstage-search-platform.yaml @@ -4,7 +4,7 @@ author: Spotify authorUrl: https://github.com/spotify category: Core Feature description: A composable and extensible search platform built to fit your organization’s needs and find information quickly. -documentation: https://backstage.io/docs/features/software-catalog/software-catalog-overview +documentation: https://backstage.io/docs/features/search/search-overview iconUrl: img/backstage-search-platform.svg npmPackageName: '@backstage/plugin-search' order: 5 diff --git a/microsite/static/css/custom.css b/microsite/static/css/custom.css index 59f9571a70..a2a63e2473 100644 --- a/microsite/static/css/custom.css +++ b/microsite/static/css/custom.css @@ -1244,12 +1244,24 @@ h3.collapsible span.arrow { transform: translateY(-50%) translateX(500px); } +@media only screen and (max-height: 675px) { + .Sidebar__Container { + top: 65%; + } +} + +@media only screen and (max-width: 650px) { + .Sidebar__Container { + transform: translateY(-50%) translateX(300px); + } +} + .Sidebar__Container--open { transform: translateY(-50%); } .Sidebar__Button { - transform: rotate(-90deg) translateY(48px); + transform: rotate(-90deg) translateY(49px); padding: 12px 16px; border-radius: 8px 8px 0 0; background-color: rgb(92, 214, 200); @@ -1263,18 +1275,34 @@ h3.collapsible span.arrow { cursor: pointer; } +@media only screen and (max-width: 650px) { + .Sidebar__Button { + width: 175px; + font-size: 15px; + } +} + .Sidebar__Button:hover { - transform: rotate(-90deg) translateY(48px) scale(1.01); + transform: rotate(-90deg) translateY(49px) scale(1.01); } #Sidebar__HubSpotContainer { width: 500px; background-color: white; border-radius: 8px 0 0 8px; - padding: 16px; - padding-bottom: 0px; - z-index: 10001; - min-height: 260px; + height: 500px; +} + +@media only screen and (max-width: 650px) { + #Sidebar__HubSpotContainer { + width: 300px; + } +} + +#Sidebar__HubSpotContainer form { + overflow-y: auto; + height: 100%; + padding: 25px 25px 0px 25px; } #Sidebar__HubSpotContainer .hs-button { @@ -1284,6 +1312,7 @@ h3.collapsible span.arrow { color: rgb(0, 0, 0); border: 0; } + #Sidebar__HubSpotContainer.submitted-message { min-height: 260px; display: flex; diff --git a/package.json b/package.json index 7e6a66e892..d458fadb9d 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.10.0", + "version": "1.11.0-next.0", "dependencies": { "@backstage/errors": "workspace:^", "@manypkg/get-packages": "^1.1.3" diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 377507d639..308dca26c5 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,60 @@ # example-app +## 0.2.80-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-azure-devops@0.2.6-next.0 + - @backstage/plugin-scaffolder-react@1.1.0-next.0 + - @backstage/plugin-scaffolder@1.11.0-next.0 + - @backstage/plugin-api-docs@0.8.15-next.0 + - @backstage/plugin-techdocs@1.4.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/plugin-user-settings@0.6.3-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-kubernetes@0.7.8-next.0 + - @backstage/plugin-airbrake@0.3.15-next.0 + - @backstage/plugin-azure-sites@0.1.4-next.0 + - @backstage/plugin-badges@0.2.39-next.0 + - @internal/plugin-catalog-customized@0.0.7-next.0 + - @backstage/plugin-catalog-graph@0.2.27-next.0 + - @backstage/plugin-catalog-import@0.9.5-next.0 + - @backstage/plugin-circleci@0.3.15-next.0 + - @backstage/plugin-cloudbuild@0.3.15-next.0 + - @backstage/plugin-code-coverage@0.2.8-next.0 + - @backstage/plugin-cost-insights@0.12.4-next.0 + - @backstage/plugin-dynatrace@2.0.0-next.0 + - @backstage/plugin-explore@0.3.46-next.0 + - @backstage/plugin-github-actions@0.5.15-next.0 + - @backstage/plugin-gocd@0.1.21-next.0 + - @backstage/plugin-home@0.4.31-next.0 + - @backstage/plugin-jenkins@0.7.14-next.0 + - @backstage/plugin-kafka@0.3.15-next.0 + - @backstage/plugin-lighthouse@0.3.15-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.8-next.0 + - @backstage/plugin-org@0.6.5-next.0 + - @backstage/plugin-pagerduty@0.5.8-next.0 + - @backstage/plugin-playlist@0.1.6-next.0 + - @backstage/plugin-rollbar@0.4.15-next.0 + - @backstage/plugin-search@1.0.8-next.0 + - @backstage/plugin-sentry@0.4.8-next.0 + - @backstage/plugin-tech-insights@0.3.7-next.0 + - @backstage/plugin-todo@0.2.17-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-techdocs-react@1.1.3-next.0 + - @backstage/cli@0.22.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.10-next.0 + - @backstage/integration-react@1.1.9 + - @backstage/plugin-apache-airflow@0.2.7 + - @backstage/plugin-gcalendar@0.3.10 + - @backstage/plugin-gcp-projects@0.3.33 + - @backstage/plugin-graphiql@0.2.46 + - @backstage/plugin-newrelic@0.3.32 + - @backstage/plugin-shortcuts@0.3.6 + - @backstage/plugin-stack-overflow@0.1.11-next.0 + - @backstage/plugin-tech-radar@0.6.0 + ## 0.2.79 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 2684d5ccb6..f1edc7ee0e 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.79", + "version": "0.2.80-next.0", "private": true, "backstage": { "role": "frontend" diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index c5410c4f80..8984a69259 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -244,6 +244,9 @@ const routes = ( + + + } /> { - console.log(chalk.red('Failed to compile.\n')); - throw new Error(`Failed to compile.\n${error.message || error}`); - }); + const { stats } = await build(config, isCi); if (!stats) { throw new Error('No stats returned'); @@ -114,7 +115,7 @@ async function build(config: webpack.Configuration, isCi: boolean) { ); if (!stats) { - throw new Error('No stats provided'); + throw new Error('Failed to compile: No stats provided'); } const serializedStats = stats.toJson({ @@ -122,29 +123,33 @@ async function build(config: webpack.Configuration, isCi: boolean) { warnings: true, errors: true, }); - // NOTE(freben): The code below that extracts the message part of the errors, - // is due to react-dev-utils not yet being compatible with webpack 5. This - // may be possible to remove (just passing the serialized stats object - // directly into the format function) after a new release of react-dev-utils - // has been made available. - // See https://github.com/facebook/create-react-app/issues/9880 const { errors, warnings } = formatWebpackMessages({ - errors: serializedStats.errors?.map(e => (e.message ? e.message : e)), - warnings: serializedStats.warnings?.map(e => (e.message ? e.message : e)), + 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. - throw new Error(errors[0]); + 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(warnings.join('\n\n')); + throw new Error(warningsWithContext.join('\n\n')); } return { stats }; diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 0d9df01182..6eab052028 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/create-app +## 0.4.37-next.0 + +### Patch Changes + +- Bumped create-app version. + ## 0.4.36 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 5d2e98992c..05674c9673 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/create-app", "description": "A CLI that helps you create your own Backstage app", - "version": "0.4.36", + "version": "0.4.37-next.0", "publishConfig": { "access": "public" }, diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index febc77f339..225f8984f4 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/dev-utils +## 1.0.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/integration-react@1.1.9 + ## 1.0.11 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 110c086b5f..c8bcae4365 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/dev-utils", "description": "Utilities for developing Backstage plugins.", - "version": "1.0.11", + "version": "1.0.12-next.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index d87c99bd02..3f00a6a03d 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,17 @@ # techdocs-cli-embedded-app +## 0.2.79-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.4.4-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-catalog@1.7.3-next.0 + - @backstage/plugin-techdocs-react@1.1.3-next.0 + - @backstage/cli@0.22.1 + - @backstage/integration-react@1.1.9 + ## 0.2.78 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index d071574b32..8c3a970cc2 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.78", + "version": "0.2.79-next.0", "private": true, "backstage": { "role": "frontend" diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 463386bfc0..4b2566e6e2 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,16 @@ # @techdocs/cli +## 1.3.2-next.0 + +### Patch Changes + +- 6e0b6a0d50: Fixed publish command missing awsBucketRootPath option. + Fixed publish command having the gcsBucketRootPath option misconfigured, previously returning a boolean vs a string. +- Updated dependencies + - @backstage/plugin-techdocs-node@1.4.6-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + ## 1.3.0 ### Minor Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index a538ee2c4e..f60a95840c 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,7 +1,7 @@ { "name": "@techdocs/cli", "description": "Utility CLI for managing TechDocs sites in Backstage.", - "version": "1.3.0", + "version": "1.3.2-next.0", "publishConfig": { "access": "public" }, diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index 173baefd48..c03478eb10 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-adr-backend +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-adr-common@0.2.6-next.0 + ## 0.2.5 ### Patch Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index 448afabdfe..17b91e62ef 100644 --- a/plugins/adr-backend/package.json +++ b/plugins/adr-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr-backend", - "version": "0.2.5", + "version": "0.2.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md index 594c6d39c2..4ee9e2fd8e 100644 --- a/plugins/adr-common/CHANGELOG.md +++ b/plugins/adr-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-adr-common +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + ## 0.2.5 ### Patch Changes diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json index 41060fb5ca..a34cf5497c 100644 --- a/plugins/adr-common/package.json +++ b/plugins/adr-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-adr-common", "description": "Common functionalities for the adr plugin", - "version": "0.2.5", + "version": "0.2.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index a150f7d3eb..a1a9592ace 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-adr +## 0.3.1-next.0 + +### Patch Changes + +- 496cf6aff0: Render the common `` component when the `backstage.io/adr-location` annotation is missing from the component +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-adr-common@0.2.6-next.0 + - @backstage/integration-react@1.1.9 + ## 0.3.0 ### Minor Changes diff --git a/plugins/adr/package.json b/plugins/adr/package.json index 22c9018583..e8e7de06e6 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr", - "version": "0.3.0", + "version": "0.3.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index b8d0ddf0ac..3bc712aed4 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-airbrake-backend +## 0.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + ## 0.2.13 ### Patch Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index 8003d57306..f4edd43590 100644 --- a/plugins/airbrake-backend/package.json +++ b/plugins/airbrake-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake-backend", - "version": "0.2.13", + "version": "0.2.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md index d063c1146b..dde141d741 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-airbrake +## 0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/dev-utils@1.0.12-next.0 + ## 0.3.14 ### Patch Changes diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index 8b793ef129..6ff67eb3b2 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.14", + "version": "0.3.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md index faafee7664..9936e8c727 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-allure +## 0.1.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.1.30 ### Patch Changes diff --git a/plugins/allure/package.json b/plugins/allure/package.json index 4700a078c9..7398ac2f54 100644 --- a/plugins/allure/package.json +++ b/plugins/allure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-allure", "description": "A Backstage plugin that integrates with Allure", - "version": "0.1.30", + "version": "0.1.31-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index dcea892b5b..ac424c63cb 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-api-docs +## 0.8.15-next.0 + +### Patch Changes + +- 60996f8aba: Updating the readme with better `csp` instructions +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-catalog@1.7.3-next.0 + ## 0.8.14 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 334124c771..a7ad050db1 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs", "description": "A Backstage plugin that helps represent API entities in the frontend", - "version": "0.8.14", + "version": "0.8.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index 88c94b2be2..92b5e137fd 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-app-backend +## 0.3.42-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + ## 0.3.40 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 3e729baf27..a2c631be3c 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-backend", "description": "A Backstage backend plugin that serves the Backstage frontend app", - "version": "0.3.40", + "version": "0.3.42-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index 2bb5a4a695..cd39dba0f5 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend +## 0.17.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + ## 0.17.3 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index e998c866dc..1b47bd6ba5 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend", "description": "A Backstage backend plugin that handles authentication", - "version": "0.17.3", + "version": "0.17.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index ecb0448c17..c675d75b0f 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-auth-node +## 0.2.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + ## 0.2.9 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index efefb888aa..5b1c29c7d7 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.2.9", + "version": "0.2.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index 27d25f0a25..7cfd680a24 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-azure-devops-backend +## 0.3.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + ## 0.3.19 ### Patch Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index ead3a03f15..4960d8e56a 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-backend", - "version": "0.3.19", + "version": "0.3.21-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md index db73a8ff13..1a0d559ab1 100644 --- a/plugins/azure-devops/CHANGELOG.md +++ b/plugins/azure-devops/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-azure-devops +## 0.2.6-next.0 + +### Patch Changes + +- 347b16ecea: Fixed `AssignedToCurrentUsersTeams` & `CreatedByCurrentUsersTeams` filter in `AzurePullRequestsPage` component. +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.2.5 ### Patch Changes diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index a6869af668..87c9521443 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops", - "version": "0.2.5", + "version": "0.2.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md index 0c99d9cd2b..be020f508b 100644 --- a/plugins/azure-sites-backend/CHANGELOG.md +++ b/plugins/azure-sites-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-azure-sites-backend +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + ## 0.1.2 ### Patch Changes diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json index c7b25e3d66..829ed89f6a 100644 --- a/plugins/azure-sites-backend/package.json +++ b/plugins/azure-sites-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites-backend", - "version": "0.1.2", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites/CHANGELOG.md b/plugins/azure-sites/CHANGELOG.md index 4bb6ae8d57..0b7ea2a680 100644 --- a/plugins/azure-sites/CHANGELOG.md +++ b/plugins/azure-sites/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-azure-sites +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.1.3 ### Patch Changes diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json index 5eb38be60c..b636065426 100644 --- a/plugins/azure-sites/package.json +++ b/plugins/azure-sites/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites", - "version": "0.1.3", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index 7bb4a154a6..1a703ba72f 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-badges-backend +## 0.1.36-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + ## 0.1.34 ### Patch Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index e1c7e4acd0..bcc39f4c96 100644 --- a/plugins/badges-backend/package.json +++ b/plugins/badges-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges-backend", "description": "A Backstage backend plugin that generates README badges for your entities", - "version": "0.1.34", + "version": "0.1.36-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index 6171688a50..0ee582ecea 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-badges +## 0.2.39-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.2.38 ### Patch Changes diff --git a/plugins/badges/package.json b/plugins/badges/package.json index 8cfb26eb1a..717224216d 100644 --- a/plugins/badges/package.json +++ b/plugins/badges/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges", "description": "A Backstage plugin that generates README badges for your entities", - "version": "0.2.38", + "version": "0.2.39-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index 1b2bec044a..6c98a2125d 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-bazaar-backend +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.34-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + ## 0.2.3 ### Patch Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index 0636d5573c..fe9893dbbb 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.2.3", + "version": "0.2.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md index 51f77904c3..aab91930cb 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-bazaar +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-catalog@1.7.3-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/cli@0.22.1 + ## 0.2.3 ### Patch Changes diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index 2bd2bf709f..c949415d13 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.2.3", + "version": "0.2.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md index e1e8ac0eb1..a41c9ed630 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-bitrise +## 0.1.42-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.1.41 ### Patch Changes diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index ad584a5677..cf3515aa89 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitrise", "description": "A Backstage plugin that integrates towards Bitrise", - "version": "0.1.41", + "version": "0.1.42-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index 8234f499c8..39c217fc58 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.1.15-next.0 + +### Patch Changes + +- 8e025f1347: Added support for `externalId` when assuming role in `AwsS3EntityProvider` +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + ## 0.1.13 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index f9ba8e61fb..4ccc463937 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", "description": "A Backstage catalog backend module that helps integrate towards AWS", - "version": "0.1.13", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-aws/src/credentials/AwsCredentials.ts b/plugins/catalog-backend-module-aws/src/credentials/AwsCredentials.ts index ffb84d1c34..fded78aed4 100644 --- a/plugins/catalog-backend-module-aws/src/credentials/AwsCredentials.ts +++ b/plugins/catalog-backend-module-aws/src/credentials/AwsCredentials.ts @@ -27,6 +27,7 @@ export class AwsCredentials { accessKeyId?: string; secretAccessKey?: string; roleArn?: string; + externalId?: string; }, roleSessionName: string, ): Credentials | CredentialsOptions | undefined { @@ -52,6 +53,7 @@ export class AwsCredentials { params: { RoleArn: roleArn, RoleSessionName: roleSessionName, + ExternalId: config.externalId, }, }); } diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index bb61f34884..33d4ea499c 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + ## 0.1.11 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 292edb0e80..366a4e05ee 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", "description": "A Backstage catalog backend module that helps integrate towards Azure", - "version": "0.1.11", + "version": "0.1.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index da1cf2f177..71a876e98a 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + ## 0.1.7 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 142fb4617d..9b1c18ddb2 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", - "version": "0.1.7", + "version": "0.1.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index efcb84d975..1290c701b6 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + ## 0.1.5 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index 4c19df0582..b9b1eff3d4 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.1.5", + "version": "0.1.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md index 12f7317c25..390601b255 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + ## 0.2.7 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index 43bce0f00e..e5bb59e93d 100644 --- a/plugins/catalog-backend-module-bitbucket/package.json +++ b/plugins/catalog-backend-module-bitbucket/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket", - "version": "0.2.7", + "version": "0.2.9-next.0", "deprecated": true, "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 0ee1a11e24..80723a0f97 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + ## 0.1.8 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 3638237a9e..0ab3e69749 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.1.8", + "version": "0.1.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index a942ba0f20..d8d457c0c4 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-github +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + ## 0.2.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 57b72cebe9..ae485f101f 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-github", "description": "A Backstage catalog backend module that helps integrate towards GitHub", - "version": "0.2.3", + "version": "0.2.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 95e436c122..36696fc777 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + ## 0.1.11 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 79cf8fcb14..dc9f7c9d3a 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", "description": "A Backstage catalog backend module that helps integrate towards GitLab", - "version": "0.1.11", + "version": "0.1.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index 10ac2388d7..1380f51750 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.2.0-next.0 + +### Minor Changes + +- 1ba120faa3: Added new mechanism to handle deltas in incremental providers + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-test-utils@0.1.34-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/api-report.md b/plugins/catalog-backend-module-incremental-ingestion/api-report.md index 4bf6bb9456..fe9ef24777 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/api-report.md +++ b/plugins/catalog-backend-module-incremental-ingestion/api-report.md @@ -11,6 +11,7 @@ import type { Config } from '@backstage/config'; import type { DeferredEntity } from '@backstage/plugin-catalog-backend'; import type { DurationObjectUnits } from 'luxon'; import { EventParams } from '@backstage/plugin-events-node'; +import { EventSubscriber } from '@backstage/plugin-events-node'; import type { Logger } from 'winston'; import type { PermissionEvaluator } from '@backstage/plugin-permission-common'; import type { PluginDatabaseManager } from '@backstage/backend-common'; @@ -37,7 +38,7 @@ export class IncrementalCatalogBuilder { addIncrementalEntityProvider( provider: IncrementalEntityProvider, options: IncrementalEntityProviderOptions, - ): void; + ): EventSubscriber; // (undocumented) build(): Promise<{ incrementalAdminRouter: Router; diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index c0eb027ac2..c7bb13425a 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", "description": "An entity provider for streaming large asset sources into the catalog", - "version": "0.1.1", + "version": "0.2.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts b/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts index 6d2b3e2be5..c8458be09b 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts @@ -26,6 +26,7 @@ import { applyDatabaseMigrations } from '../database/migrations'; import { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager'; import { IncrementalProviderRouter } from '../router/routes'; import { Deferred } from '../util'; +import { EventParams, EventSubscriber } from '@backstage/plugin-events-node'; /** @public */ export class IncrementalCatalogBuilder { @@ -71,13 +72,15 @@ export class IncrementalCatalogBuilder { addIncrementalEntityProvider( provider: IncrementalEntityProvider, options: IncrementalEntityProviderOptions, - ) { + ): EventSubscriber { const { burstInterval, burstLength, restLength } = options; const { logger: catalogLogger, scheduler } = this.env; const ready = this.ready; const manager = this.manager; + let engine: IncrementalIngestionEngine; + this.builder.addEntityProvider({ getProviderName: provider.getProviderName.bind(provider), async connect(connection) { @@ -87,7 +90,7 @@ export class IncrementalCatalogBuilder { logger.info(`Connecting`); - const engine = new IncrementalIngestionEngine({ + engine = new IncrementalIngestionEngine({ ...options, ready, manager, @@ -112,5 +115,12 @@ export class IncrementalCatalogBuilder { }); }, }); + + return { + onEvent: (params: EventParams) => engine.onEvent(params), + supportsEventTopics() { + return engine.supportsEventTopics(); + }, + }; } } diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index c860f90323..2ae5a8c2b4 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + ## 0.5.7 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index e7911aa90f..6553080d2c 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", "description": "A Backstage catalog backend module that helps integrate towards LDAP", - "version": "0.5.7", + "version": "0.5.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index 2dbbfc0d09..6a93a81c5b 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.4.8-next.0 + +### Patch Changes + +- 0daa328c3a: Extract default transformers to their own file +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + ## 0.4.6 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index cd3ca706ac..615dfc366f 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", - "version": "0.4.6", + "version": "0.4.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/defaultTransformers.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/defaultTransformers.ts new file mode 100644 index 0000000000..7a8c4ec463 --- /dev/null +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/defaultTransformers.ts @@ -0,0 +1,159 @@ +/* + * 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 { + MICROSOFT_EMAIL_ANNOTATION, + MICROSOFT_GRAPH_GROUP_ID_ANNOTATION, + MICROSOFT_GRAPH_TENANT_ID_ANNOTATION, + MICROSOFT_GRAPH_USER_ID_ANNOTATION, +} from './constants'; +import { normalizeEntityName } from './helper'; +import { GroupEntity, UserEntity } from '@backstage/catalog-model'; +import * as MicrosoftGraph from '@microsoft/microsoft-graph-types'; + +/** + * The default implementation of the transformation from a graph organization + * entry to a Group entity. + * + * @public + */ +export async function defaultOrganizationTransformer( + organization: MicrosoftGraph.Organization, +): Promise { + if (!organization.id || !organization.displayName) { + return undefined; + } + + const name = normalizeEntityName(organization.displayName!); + return { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: name, + description: organization.displayName!, + annotations: { + [MICROSOFT_GRAPH_TENANT_ID_ANNOTATION]: organization.id!, + }, + }, + spec: { + type: 'root', + profile: { + displayName: organization.displayName!, + }, + children: [], + }, + }; +} + +function extractGroupName(group: MicrosoftGraph.Group): string { + if (group.securityEnabled) { + return group.displayName as string; + } + return (group.mailNickname || group.displayName) as string; +} + +/** + * The default implementation of the transformation from a graph group entry to + * a Group entity. + * + * @public + */ +export async function defaultGroupTransformer( + group: MicrosoftGraph.Group, + groupPhoto?: string, +): Promise { + if (!group.id || !group.displayName) { + return undefined; + } + + const name = normalizeEntityName(extractGroupName(group)); + const entity: GroupEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: name, + annotations: { + [MICROSOFT_GRAPH_GROUP_ID_ANNOTATION]: group.id, + }, + }, + spec: { + type: 'team', + profile: {}, + children: [], + }, + }; + + if (group.description) { + entity.metadata.description = group.description; + } + if (group.displayName) { + entity.spec.profile!.displayName = group.displayName; + } + if (group.mail) { + entity.spec.profile!.email = group.mail; + } + if (groupPhoto) { + entity.spec.profile!.picture = groupPhoto; + } + + return entity; +} + +/** + * The default implementation of the transformation from a graph user entry to + * a User entity. + * + * @public + */ +export async function defaultUserTransformer( + user: MicrosoftGraph.User, + userPhoto?: string, +): Promise { + if (!user.id || !user.displayName || !user.mail) { + return undefined; + } + + const name = normalizeEntityName(user.mail); + const entity: UserEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'User', + metadata: { + name, + annotations: { + [MICROSOFT_EMAIL_ANNOTATION]: user.mail!, + [MICROSOFT_GRAPH_USER_ID_ANNOTATION]: user.id!, + }, + }, + spec: { + profile: { + displayName: user.displayName!, + email: user.mail!, + + // TODO: Additional fields? + // jobTitle: user.jobTitle || undefined, + // officeLocation: user.officeLocation || undefined, + // mobilePhone: user.mobilePhone || undefined, + }, + memberOf: [], + }, + }; + + if (userPhoto) { + entity.spec.profile!.picture = userPhoto; + } + + return entity; +} diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/index.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/index.ts index e9ab49f7d1..37dcffec22 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/index.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/index.ts @@ -29,8 +29,8 @@ export { defaultGroupTransformer, defaultOrganizationTransformer, defaultUserTransformer, - readMicrosoftGraphOrg, -} from './read'; +} from './defaultTransformers'; +export { readMicrosoftGraphOrg } from './read'; export type { GroupTransformer, OrganizationTransformer, diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts index d0c09d6267..a060df5ea3 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts @@ -19,72 +19,28 @@ import { stringifyEntityRef, UserEntity, } from '@backstage/catalog-model'; -import * as MicrosoftGraph from '@microsoft/microsoft-graph-types'; import limiterFactory from 'p-limit'; import { Logger } from 'winston'; import { MicrosoftGraphClient } from './client'; import { - MICROSOFT_EMAIL_ANNOTATION, MICROSOFT_GRAPH_GROUP_ID_ANNOTATION, MICROSOFT_GRAPH_TENANT_ID_ANNOTATION, MICROSOFT_GRAPH_USER_ID_ANNOTATION, } from './constants'; -import { normalizeEntityName } from './helper'; import { buildMemberOf, buildOrgHierarchy } from './org'; import { GroupTransformer, OrganizationTransformer, UserTransformer, } from './types'; +import { + defaultGroupTransformer, + defaultOrganizationTransformer, + defaultUserTransformer, +} from './defaultTransformers'; const PAGE_SIZE = 999; -/** - * The default implementation of the transformation from a graph user entry to - * a User entity. - * - * @public - */ -export async function defaultUserTransformer( - user: MicrosoftGraph.User, - userPhoto?: string, -): Promise { - if (!user.id || !user.displayName || !user.mail) { - return undefined; - } - - const name = normalizeEntityName(user.mail); - const entity: UserEntity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'User', - metadata: { - name, - annotations: { - [MICROSOFT_EMAIL_ANNOTATION]: user.mail!, - [MICROSOFT_GRAPH_USER_ID_ANNOTATION]: user.id!, - }, - }, - spec: { - profile: { - displayName: user.displayName!, - email: user.mail!, - - // TODO: Additional fields? - // jobTitle: user.jobTitle || undefined, - // officeLocation: user.officeLocation || undefined, - // mobilePhone: user.mobilePhone || undefined, - }, - memberOf: [], - }, - }; - - if (userPhoto) { - entity.spec.profile!.picture = userPhoto; - } - - return entity; -} - export async function readMicrosoftGraphUsers( client: MicrosoftGraphClient, options: { @@ -190,40 +146,6 @@ export async function readMicrosoftGraphUsersInGroups( }; } -/** - * The default implementation of the transformation from a graph organization - * entry to a Group entity. - * - * @public - */ -export async function defaultOrganizationTransformer( - organization: MicrosoftGraph.Organization, -): Promise { - if (!organization.id || !organization.displayName) { - return undefined; - } - - const name = normalizeEntityName(organization.displayName!); - return { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Group', - metadata: { - name: name, - description: organization.displayName!, - annotations: { - [MICROSOFT_GRAPH_TENANT_ID_ANNOTATION]: organization.id!, - }, - }, - spec: { - type: 'root', - profile: { - displayName: organization.displayName!, - }, - children: [], - }, - }; -} - export async function readMicrosoftGraphOrganization( client: MicrosoftGraphClient, tenantId: string, @@ -239,60 +161,6 @@ export async function readMicrosoftGraphOrganization( return { rootGroup }; } -function extractGroupName(group: MicrosoftGraph.Group): string { - if (group.securityEnabled) { - return group.displayName as string; - } - return (group.mailNickname || group.displayName) as string; -} - -/** - * The default implementation of the transformation from a graph group entry to - * a Group entity. - * - * @public - */ -export async function defaultGroupTransformer( - group: MicrosoftGraph.Group, - groupPhoto?: string, -): Promise { - if (!group.id || !group.displayName) { - return undefined; - } - - const name = normalizeEntityName(extractGroupName(group)); - const entity: GroupEntity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Group', - metadata: { - name: name, - annotations: { - [MICROSOFT_GRAPH_GROUP_ID_ANNOTATION]: group.id, - }, - }, - spec: { - type: 'team', - profile: {}, - children: [], - }, - }; - - if (group.description) { - entity.metadata.description = group.description; - } - if (group.displayName) { - entity.spec.profile!.displayName = group.displayName; - } - if (group.mail) { - entity.spec.profile!.email = group.mail; - } - if (groupPhoto) { - entity.spec.profile!.picture = groupPhoto; - } - - return entity; -} - export async function readMicrosoftGraphGroups( client: MicrosoftGraphClient, tenantId: string, diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 522202cd43..0f9b04f997 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + ## 0.1.6 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index d39d3aa304..798a6d9008 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", - "version": "0.1.6", + "version": "0.1.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 904cc379a6..06583f2e9b 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend +## 1.7.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + - @backstage/plugin-permission-node@0.7.5-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + ## 1.7.0 ### Minor Changes diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index 6ff9ac4b1f..f15f6b9ba9 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -167,6 +167,11 @@ export class CatalogBuilder { useLegacySingleProcessorValidation(): this; } +// @public (undocumented) +export type CatalogCollatorEntityTransformer = ( + entity: Entity, +) => Omit; + // @alpha export const catalogConditions: Conditions<{ hasAnnotation: PermissionRule< @@ -350,6 +355,9 @@ export class DefaultCatalogCollator { readonly visibilityPermission: Permission; } +// @public (undocumented) +export const defaultCatalogCollatorEntityTransformer: CatalogCollatorEntityTransformer; + // @public (undocumented) export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { // (undocumented) @@ -360,7 +368,7 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { // (undocumented) getCollator(): Promise; // (undocumented) - readonly type: string; + readonly type = 'software-catalog'; // (undocumented) readonly visibilityPermission: Permission; } @@ -373,6 +381,7 @@ export type DefaultCatalogCollatorFactoryOptions = { filter?: GetEntitiesRequest['filter']; batchSize?: number; catalogClient?: CatalogApi; + entityTransformer?: CatalogCollatorEntityTransformer; }; export { DeferredEntity }; diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index e1dad7589a..45628825c4 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend", "description": "The Backstage backend plugin that provides the Backstage catalog", - "version": "1.7.0", + "version": "1.7.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/src/search/util.ts b/plugins/catalog-backend/src/search/CatalogCollatorEntityTransformer.ts similarity index 57% rename from plugins/catalog-backend/src/search/util.ts rename to plugins/catalog-backend/src/search/CatalogCollatorEntityTransformer.ts index fd54d397c9..86d71d4c13 100644 --- a/plugins/catalog-backend/src/search/util.ts +++ b/plugins/catalog-backend/src/search/CatalogCollatorEntityTransformer.ts @@ -14,16 +14,10 @@ * limitations under the License. */ -import { Entity, isUserEntity, isGroupEntity } from '@backstage/catalog-model'; +import { Entity } from '@backstage/catalog-model'; +import { CatalogEntityDocument } from '@backstage/plugin-catalog-common'; -export function getDocumentText(entity: Entity): string { - const documentTexts: string[] = []; - documentTexts.push(entity.metadata.description || ''); - - if (isUserEntity(entity) || isGroupEntity(entity)) { - if (entity.spec?.profile?.displayName) { - documentTexts.push(entity.spec.profile.displayName); - } - } - return documentTexts.join(' : '); -} +/** @public */ +export type CatalogCollatorEntityTransformer = ( + entity: Entity, +) => Omit; diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.test.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.test.ts index 8b4e5601b4..462e777dff 100644 --- a/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.test.ts +++ b/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.test.ts @@ -95,11 +95,6 @@ describe('DefaultCatalogCollatorFactory', () => { ); }); - it('has expected type', () => { - const factory = DefaultCatalogCollatorFactory.fromConfig(config, options); - expect(factory.type).toBe('software-catalog'); - }); - describe('getCollator', () => { let factory: DefaultCatalogCollatorFactory; let collator: Readable; @@ -124,24 +119,28 @@ describe('DefaultCatalogCollatorFactory', () => { const pipeline = TestPipeline.fromCollator(collator); const { documents } = await pipeline.execute(); - expect(documents[0]).toMatchObject({ + expect(documents[0]).toEqual({ title: expectedEntities[0].metadata.name, location: '/catalog/default/component/test-entity', text: expectedEntities[0].metadata.description, namespace: 'default', componentType: expectedEntities[0]!.spec!.type, + kind: expectedEntities[0]!.kind, + type: expectedEntities[0]!.spec!.type, lifecycle: expectedEntities[0]!.spec!.lifecycle, owner: expectedEntities[0]!.spec!.owner, authorization: { resourceRef: 'component:default/test-entity', }, }); - expect(documents[1]).toMatchObject({ + expect(documents[1]).toEqual({ title: expectedEntities[1].metadata.title, location: '/catalog/default/component/test-entity-2', text: expectedEntities[1].metadata.description, namespace: 'default', componentType: expectedEntities[1]!.spec!.type, + kind: expectedEntities[1]!.kind, + type: expectedEntities[1]!.spec!.type, lifecycle: expectedEntities[1]!.spec!.lifecycle, owner: expectedEntities[1]!.spec!.owner, authorization: { @@ -150,6 +149,61 @@ describe('DefaultCatalogCollatorFactory', () => { }); }); + it('maps a returned entity to an expected CatalogEntityDocument with custom transformer', async () => { + const customFactory = DefaultCatalogCollatorFactory.fromConfig(config, { + ...options, + entityTransformer: entity => ({ + title: `custom-title-${ + entity.metadata.title ?? entity.metadata.name + }`, + namespace: 'custom/namespace', + text: 'custom-text', + type: 'custom-type', + componentType: 'custom-component-type', + kind: 'custom-kind', + lifecycle: 'custom-lifecycle', + owner: 'custom-owner', + authorization: { + resourceRef: 'custom:resource/ref', + }, + location: '/custom/location', + }), + }); + const customCollator = await customFactory.getCollator(); + + const pipeline = TestPipeline.fromCollator(customCollator); + const { documents } = await pipeline.execute(); + + expect(documents[0]).toEqual({ + title: 'custom-title-test-entity', + location: '/catalog/default/component/test-entity', + text: 'custom-text', + namespace: 'custom/namespace', + componentType: 'custom-component-type', + kind: 'custom-kind', + type: 'custom-type', + lifecycle: 'custom-lifecycle', + owner: 'custom-owner', + authorization: { + resourceRef: 'component:default/test-entity', + }, + }); + expect(documents[1]).toEqual({ + title: 'custom-title-Test Entity', + location: '/catalog/default/component/test-entity-2', + text: 'custom-text', + namespace: 'custom/namespace', + componentType: 'custom-component-type', + kind: 'custom-kind', + type: 'custom-type', + lifecycle: 'custom-lifecycle', + owner: 'custom-owner', + authorization: { + resourceRef: 'component:default/test-entity-2', + }, + }); + }); + it('maps a returned entity with a custom locationTemplate', async () => { // Provide an alternate location template. factory = DefaultCatalogCollatorFactory.fromConfig(new ConfigReader({}), { diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.ts index cf082c271c..1c03836e51 100644 --- a/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.ts +++ b/plugins/catalog-backend/src/search/DefaultCatalogCollatorFactory.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { Config } from '@backstage/config'; import { PluginEndpointDiscovery, TokenManager, @@ -23,8 +24,6 @@ import { CatalogClient, GetEntitiesRequest, } from '@backstage/catalog-client'; -import { stringifyEntityRef } from '@backstage/catalog-model'; -import { Config } from '@backstage/config'; import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; import { catalogEntityReadPermission, @@ -32,7 +31,9 @@ import { } from '@backstage/plugin-catalog-common'; import { Permission } from '@backstage/plugin-permission-common'; import { Readable } from 'stream'; -import { getDocumentText } from './util'; +import { CatalogCollatorEntityTransformer } from './CatalogCollatorEntityTransformer'; +import { defaultCatalogCollatorEntityTransformer } from './defaultCatalogCollatorEntityTransformer'; +import { stringifyEntityRef } from '@backstage/catalog-model'; /** @public */ export type DefaultCatalogCollatorFactoryOptions = { @@ -42,11 +43,12 @@ export type DefaultCatalogCollatorFactoryOptions = { filter?: GetEntitiesRequest['filter']; batchSize?: number; catalogClient?: CatalogApi; + entityTransformer?: CatalogCollatorEntityTransformer; }; /** @public */ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { - public readonly type: string = 'software-catalog'; + public readonly type = 'software-catalog'; public readonly visibilityPermission: Permission = catalogEntityReadPermission; @@ -55,6 +57,7 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { private batchSize: number; private readonly catalogClient: CatalogApi; private tokenManager: TokenManager; + private entityTransformer: CatalogCollatorEntityTransformer; static fromConfig( _config: Config, @@ -71,6 +74,7 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { filter, catalogClient, tokenManager, + entityTransformer, } = options; this.locationTemplate = @@ -80,23 +84,14 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { this.catalogClient = catalogClient || new CatalogClient({ discoveryApi: discovery }); this.tokenManager = tokenManager; + this.entityTransformer = + entityTransformer ?? defaultCatalogCollatorEntityTransformer; } async getCollator(): Promise { return Readable.from(this.execute()); } - private applyArgsToFormat( - format: string, - args: Record, - ): string { - let formatted = format; - for (const [key, value] of Object.entries(args)) { - formatted = formatted.replace(`:${key}`, value); - } - return formatted.toLowerCase(); - } - private async *execute(): AsyncGenerator { const { token } = await this.tokenManager.getToken(); let entitiesRetrieved = 0; @@ -123,24 +118,30 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { for (const entity of entities) { yield { - title: entity.metadata.title ?? entity.metadata.name, + ...this.entityTransformer(entity), + authorization: { + resourceRef: stringifyEntityRef(entity), + }, location: this.applyArgsToFormat(this.locationTemplate, { namespace: entity.metadata.namespace || 'default', kind: entity.kind, name: entity.metadata.name, }), - text: getDocumentText(entity), - componentType: entity.spec?.type?.toString() || 'other', - type: entity.spec?.type?.toString() || 'other', - namespace: entity.metadata.namespace || 'default', - kind: entity.kind, - lifecycle: (entity.spec?.lifecycle as string) || '', - owner: (entity.spec?.owner as string) || '', - authorization: { - resourceRef: stringifyEntityRef(entity), - }, }; } } } + + private applyArgsToFormat( + format: string, + args: Record, + ): string { + let formatted = format; + + for (const [key, value] of Object.entries(args)) { + formatted = formatted.replace(`:${key}`, value); + } + + return formatted.toLowerCase(); + } } diff --git a/plugins/catalog-backend/src/search/defaultCatalogCollatorEntityTransformer.test.ts b/plugins/catalog-backend/src/search/defaultCatalogCollatorEntityTransformer.test.ts new file mode 100644 index 0000000000..8206a58599 --- /dev/null +++ b/plugins/catalog-backend/src/search/defaultCatalogCollatorEntityTransformer.test.ts @@ -0,0 +1,150 @@ +/* + * 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 { defaultCatalogCollatorEntityTransformer } from './defaultCatalogCollatorEntityTransformer'; + +const entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + title: 'Test Entity', + name: 'test-entity', + description: 'The expected description', + namespace: 'namespace', + }, + spec: { + type: 'some-type', + lifecycle: 'experimental', + owner: 'someone', + }, +}; + +const userEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'User', + metadata: { + name: 'test-user-entity', + description: 'The expected user description', + }, + spec: { + profile: { + displayName: 'User 1', + }, + }, +}; + +describe('DefaultCatalogCollatorEntityTransformer', () => { + describe('transform', () => { + it('maps a returned entity', async () => { + const document = defaultCatalogCollatorEntityTransformer(entity); + + expect(document).toMatchObject({ + title: entity.metadata.title, + text: entity.metadata.description, + namespace: entity.metadata.namespace, + componentType: entity.spec.type, + lifecycle: entity.spec.lifecycle, + owner: entity.spec.owner, + }); + }); + + it('maps a returned entity with default fallback', async () => { + const entityWithoutTitle = { + ...entity, + metadata: { + ...entity.metadata, + title: undefined, + namespace: undefined, + }, + spec: { + type: undefined, + lifecycle: undefined, + owner: undefined, + }, + }; + + const document = + defaultCatalogCollatorEntityTransformer(entityWithoutTitle); + + expect(document).toMatchObject({ + title: entity.metadata.name, + text: entity.metadata.description, + namespace: 'default', + componentType: 'other', + lifecycle: '', + owner: '', + }); + }); + + it('maps a returned user entity', async () => { + const document = defaultCatalogCollatorEntityTransformer(userEntity); + + expect(document).toMatchObject({ + title: userEntity.metadata.name, + text: `${userEntity.metadata.description} : ${userEntity.spec.profile.displayName}`, + namespace: 'default', + componentType: 'other', + lifecycle: '', + owner: '', + }); + }); + + it('maps a returned user entity without display name', async () => { + const testEntity = { + ...userEntity, + spec: undefined, + }; + + const document = defaultCatalogCollatorEntityTransformer(testEntity); + + expect(document).toMatchObject({ + title: userEntity.metadata.name, + text: userEntity.metadata.description, + namespace: 'default', + componentType: 'other', + lifecycle: '', + owner: '', + }); + }); + + it('maps a returned group entity', async () => { + const groupEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: 'test-group-entity', + description: 'The expected group description', + }, + spec: { + profile: { + displayName: 'Group 1', + }, + }, + }; + + const document = defaultCatalogCollatorEntityTransformer(groupEntity); + + expect(document).toMatchObject({ + title: groupEntity.metadata.name, + text: `${groupEntity.metadata.description} : ${groupEntity.spec.profile.displayName}`, + namespace: 'default', + componentType: 'other', + lifecycle: '', + owner: '', + }); + }); + }); +}); diff --git a/plugins/catalog-backend/src/search/defaultCatalogCollatorEntityTransformer.ts b/plugins/catalog-backend/src/search/defaultCatalogCollatorEntityTransformer.ts new file mode 100644 index 0000000000..2fc0c5d50d --- /dev/null +++ b/plugins/catalog-backend/src/search/defaultCatalogCollatorEntityTransformer.ts @@ -0,0 +1,46 @@ +/* + * 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 { Entity, isGroupEntity, isUserEntity } from '@backstage/catalog-model'; +import { CatalogCollatorEntityTransformer } from './CatalogCollatorEntityTransformer'; + +const getDocumentText = (entity: Entity): string => { + const documentTexts: string[] = []; + documentTexts.push(entity.metadata.description || ''); + + if (isUserEntity(entity) || isGroupEntity(entity)) { + if (entity.spec?.profile?.displayName) { + documentTexts.push(entity.spec.profile.displayName); + } + } + + return documentTexts.join(' : '); +}; + +/** @public */ +export const defaultCatalogCollatorEntityTransformer: CatalogCollatorEntityTransformer = + (entity: Entity) => { + return { + title: entity.metadata.title ?? entity.metadata.name, + text: getDocumentText(entity), + componentType: entity.spec?.type?.toString() || 'other', + type: entity.spec?.type?.toString() || 'other', + namespace: entity.metadata.namespace || 'default', + kind: entity.kind, + lifecycle: (entity.spec?.lifecycle as string) || '', + owner: (entity.spec?.owner as string) || '', + }; + }; diff --git a/plugins/catalog-backend/src/search/index.ts b/plugins/catalog-backend/src/search/index.ts index 2602f0fada..c2a23e5132 100644 --- a/plugins/catalog-backend/src/search/index.ts +++ b/plugins/catalog-backend/src/search/index.ts @@ -16,6 +16,8 @@ export { DefaultCatalogCollatorFactory } from './DefaultCatalogCollatorFactory'; export type { DefaultCatalogCollatorFactoryOptions } from './DefaultCatalogCollatorFactory'; +export type { CatalogCollatorEntityTransformer } from './CatalogCollatorEntityTransformer'; +export type { defaultCatalogCollatorEntityTransformer } from './defaultCatalogCollatorEntityTransformer'; /** * todo(backstage/techdocs-core): stop exporting this in a future release. diff --git a/plugins/catalog-backend/src/search/util.test.ts b/plugins/catalog-backend/src/search/util.test.ts deleted file mode 100644 index d2d1776338..0000000000 --- a/plugins/catalog-backend/src/search/util.test.ts +++ /dev/null @@ -1,146 +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 { - ComponentEntity, - GroupEntity, - UserEntity, -} from '@backstage/catalog-model'; -import { getDocumentText } from './util'; - -describe('getDocumentText', () => { - describe('kind is not User or Group', () => { - test('contains description if set', () => { - const entity = createComponent(); - entity.metadata.description = 'The expected description'; - const actual = getDocumentText(entity); - expect(actual).toContain(entity.metadata.description); - }); - - test('is empty if description is not set', () => { - const entity = createComponent(); - const actual = getDocumentText(entity); - expect(actual).toEqual(''); - }); - }); - - describe('kind is User', () => { - test('contains display name if set', () => { - const entity = createUser(); - const actual = getDocumentText(entity); - expect(actual).toContain(entity.spec.profile?.displayName); - }); - - test('contains description if set', () => { - const entity = createUser(); - const actual = getDocumentText(entity); - expect(actual).toContain(entity.metadata.description); - }); - - test('contains both description and display name if both are set', () => { - const entity = createUser(); - const actual = getDocumentText(entity); - expect(actual).toContain(entity.spec.profile?.displayName); - expect(actual).toContain(entity.metadata.description); - }); - - test('is empty if description and display name are not set', () => { - const entity = createUser(); - delete entity.metadata.description; - delete entity.spec.profile?.displayName; - const actual = getDocumentText(entity); - expect(actual).toEqual(''); - }); - }); - - describe('kind is Group', () => { - test('contains display name if set', () => { - const entity = createGroup(); - const actual = getDocumentText(entity); - expect(actual).toContain(entity.spec.profile?.displayName); - }); - - test('contains description if set', () => { - const entity = createGroup(); - const actual = getDocumentText(entity); - expect(actual).toContain(entity.metadata.description); - }); - - test('contains both description and display name if both are set', () => { - const entity = createGroup(); - const actual = getDocumentText(entity); - expect(actual).toContain(entity.spec.profile?.displayName); - expect(actual).toContain(entity.metadata.description); - }); - - test('is empty if description and display name are not set', () => { - const entity = createGroup(); - delete entity.metadata.description; - delete entity.spec.profile?.displayName; - const actual = getDocumentText(entity); - expect(actual).toEqual(''); - }); - }); -}); - -function createGroup(): GroupEntity { - return { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Group', - metadata: { - name: 'group-1', - description: 'The expected description', - }, - spec: { - type: 'team', - profile: { - displayName: 'Group 1', - }, - children: [], - }, - }; -} - -function createUser(): UserEntity { - return { - apiVersion: 'backstage.io/v1alpha1', - kind: 'User', - metadata: { - name: 'user-1', - description: 'The expected description', - }, - spec: { - profile: { - displayName: 'User 1', - }, - }, - }; -} - -function createComponent(): ComponentEntity { - return { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'component-1', - }, - spec: { - lifecycle: 'experimental', - owner: 'someone', - type: 'service', - }, - }; -} diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md index f4f998d7db..7ea2f35c98 100644 --- a/plugins/catalog-common/CHANGELOG.md +++ b/plugins/catalog-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-common +## 1.0.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + ## 1.0.10 ### Patch Changes diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index 0f8aa3ea35..f5c91f3697 100644 --- a/plugins/catalog-common/package.json +++ b/plugins/catalog-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-common", "description": "Common functionalities for the catalog plugin", - "version": "1.0.10", + "version": "1.0.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-customized/CHANGELOG.md b/plugins/catalog-customized/CHANGELOG.md index bba1464d15..6f03f91b9f 100644 --- a/plugins/catalog-customized/CHANGELOG.md +++ b/plugins/catalog-customized/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-catalog-customized +## 0.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/plugin-catalog@1.7.3-next.0 + ## 0.0.6 ### Patch Changes diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json index 5737cf6fea..27cf26f3f2 100644 --- a/plugins/catalog-customized/package.json +++ b/plugins/catalog-customized/package.json @@ -1,7 +1,7 @@ { "name": "@internal/plugin-catalog-customized", "description": "The internal Backstage Customizable plugin for browsing the Backstage catalog", - "version": "0.0.6", + "version": "0.0.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index 04448a0ccf..417fe6ae95 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-graph +## 0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + ## 0.2.26 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 936ce63a5f..61d517c1dd 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.2.26", + "version": "0.2.27-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graphql/CHANGELOG.md b/plugins/catalog-graphql/CHANGELOG.md index 4b083110ca..5d4581212a 100644 --- a/plugins/catalog-graphql/CHANGELOG.md +++ b/plugins/catalog-graphql/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-graphql +## 0.3.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + ## 0.3.17 ### Patch Changes diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json index e76c1fbb69..2f68052900 100644 --- a/plugins/catalog-graphql/package.json +++ b/plugins/catalog-graphql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-graphql", "description": "An experimental Backstage catalog GraphQL module", - "version": "0.3.17", + "version": "0.3.18-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index dcabceeea1..51c8ccd448 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-import +## 0.9.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/integration-react@1.1.9 + ## 0.9.4 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index e7a07077d6..7fb456a311 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-import", "description": "A Backstage plugin the helps you import entities into your catalog", - "version": "0.9.4", + "version": "0.9.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 03e1392d47..7c133e34c2 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-node +## 1.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + ## 1.3.1 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index 7a5b8d71cf..ead9801888 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-node", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", - "version": "1.3.1", + "version": "1.3.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index edfc2cad6b..d1a878b434 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-react +## 1.3.0-next.0 + +### Minor Changes + +- 929e1afe1b: Add `initialFilter` prop to EntityLifecyclePicker. This allows you to set an initial lifecycle for the catalog. + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + ## 1.2.4 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 1f2babba77..871107e104 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-react", "description": "A frontend library that helps other Backstage plugins interact with the catalog", - "version": "1.2.4", + "version": "1.3.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index e28bf69da0..4c79fb57a4 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog +## 1.7.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/integration-react@1.1.9 + ## 1.7.2 ### Patch Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index bd4bae6437..11231894a3 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog", "description": "The Backstage plugin for browsing the Backstage catalog", - "version": "1.7.2", + "version": "1.7.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index 1fb34871d6..3d1dbae39d 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-cicd-statistics@0.1.17-next.0 + ## 0.1.10 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index 70a9d630ea..e3ffb0aa15 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics-module-gitlab", "description": "CI/CD Statistics plugin module; Gitlab CICD", - "version": "0.1.10", + "version": "0.1.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md index 22d5e67a36..09a9d200d2 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-cicd-statistics +## 0.1.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.1.16 ### Patch Changes diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index 3bfd432a01..d660c758ff 100644 --- a/plugins/cicd-statistics/package.json +++ b/plugins/cicd-statistics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics", "description": "A frontend plugin visualizing CI/CD pipeline statistics (build time)", - "version": "0.1.16", + "version": "0.1.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md index 6bfcd0373e..0221219b27 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-circleci +## 0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.3.14 ### Patch Changes diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 4bd346c96e..7a8c82c7ad 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-circleci", "description": "A Backstage plugin that integrates towards Circle CI", - "version": "0.3.14", + "version": "0.3.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md index c78ea57cdc..23c6373e43 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-cloudbuild +## 0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.3.14 ### Patch Changes diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index 6683982abe..3be78201a9 100644 --- a/plugins/cloudbuild/package.json +++ b/plugins/cloudbuild/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cloudbuild", "description": "A Backstage plugin that integrates towards Google Cloud Build", - "version": "0.3.14", + "version": "0.3.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index 5e6e58bd54..b6eae04858 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-code-climate +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.1.14 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 5567f8b048..9bf655af53 100644 --- a/plugins/code-climate/package.json +++ b/plugins/code-climate/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-code-climate", - "version": "0.1.14", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index fc1bbe4d00..cff23e1e44 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-code-coverage-backend +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + ## 0.2.6 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index 908ab1f978..d9966078c9 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage-backend", "description": "A Backstage backend plugin that helps you keep track of your code coverage", - "version": "0.2.6", + "version": "0.2.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index dbcbb6fdbe..70831e5842 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-code-coverage +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.2.7 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index 5c181d0a8c..b5a0bc93d3 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage", "description": "A Backstage plugin that helps you keep track of your code coverage", - "version": "0.2.7", + "version": "0.2.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md index 343319032a..0828647aac 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-cost-insights +## 0.12.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.12.3 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index 1a3ced06a7..449338c32d 100644 --- a/plugins/cost-insights/package.json +++ b/plugins/cost-insights/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights", "description": "A Backstage plugin that helps you keep track of your cloud spend", - "version": "0.12.3", + "version": "0.12.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index 63ffdd5da9..a201886305 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-dynatrace +## 2.0.0-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 1.0.4 ### Patch Changes diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index 03c0f97f16..0a2006f1ad 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "1.0.4", + "version": "2.0.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index 6fc92e2700..4086a1f7a2 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + ## 0.1.2 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 323b015237..e76e71ecfe 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.1.2", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 1e4c666332..6b76965e00 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-azure +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + ## 0.1.2 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 4e5c429b39..68d3b0a2ad 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.1.2", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index bf95401831..2141562a13 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + ## 0.1.2 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index 7c6496c946..7a2b599885 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.1.2", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index 8fdb5fd6d8..11b37dd443 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + ## 0.1.2 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index 98832ea84c..199077d990 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.1.2", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index 47fdc41032..3ece4590aa 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-github +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + ## 0.1.2 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 7d5fcf9981..9975107d17 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.1.2", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index e87e9cf0ee..87e478b56a 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + ## 0.1.2 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index 8c7d08ef71..a09577ae0e 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.1.2", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index ad60c22bf1..c786d4540e 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.3-next.0 + ## 0.1.2 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 26a8f9bdb4..fa99c54da1 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-backend-test-utils", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", - "version": "0.1.2", + "version": "0.1.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index 7fe73314f5..ea8e4a2c47 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + - @backstage/plugin-events-node@0.2.3-next.0 + ## 0.2.1 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 23e388e2b9..375fdd9034 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.2.1", + "version": "0.2.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index e8f37ea791..61e19f995b 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-node +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.3.2-next.0 + ## 0.2.1 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 7d7992db7c..9be7706e1e 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-node", "description": "The plugin-events-node module for @backstage/plugin-events-backend", - "version": "0.2.1", + "version": "0.2.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index cf6ea72eb9..b3db395424 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-todo-list-backend +## 1.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + ## 1.0.9 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index bf8eaa48dd..123f2c78ad 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.9", + "version": "1.0.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md index 39507030de..b2465ea308 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-explore-backend +## 0.0.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + ## 0.0.2 ### Patch Changes diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index eca8761c84..399f4df018 100644 --- a/plugins/explore-backend/package.json +++ b/plugins/explore-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-explore-backend", - "version": "0.0.2", + "version": "0.0.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md index 4730211b0d..e6d5dd2ecc 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-explore +## 0.3.46-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-explore-react@0.0.25 + ## 0.3.45 ### Patch Changes diff --git a/plugins/explore/package.json b/plugins/explore/package.json index 19ec095c09..6700ba09e8 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore", "description": "A Backstage plugin for building an exploration page of your software ecosystem", - "version": "0.3.45", + "version": "0.3.46-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index f4156731bb..60d4bad35f 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-firehydrant +## 0.1.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + ## 0.1.31 ### Patch Changes diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 6ddfa301b9..bd1536d76f 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-firehydrant", "description": "A Backstage plugin that integrates towards FireHydrant", - "version": "0.1.31", + "version": "0.1.32-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md index 3fc6dd9738..d91bd1e0b2 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-fossa +## 0.2.47-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.2.46 ### Patch Changes diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index 2ad62b8a4f..131ea2f747 100644 --- a/plugins/fossa/package.json +++ b/plugins/fossa/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-fossa", "description": "A Backstage plugin that integrates towards FOSSA", - "version": "0.2.46", + "version": "0.2.47-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index 88cf0f6808..4f291714f6 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-github-actions +## 0.5.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.5.14 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index 93320fe766..2fd5234847 100644 --- a/plugins/github-actions/package.json +++ b/plugins/github-actions/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-actions", "description": "A Backstage plugin that integrates towards GitHub Actions", - "version": "0.5.14", + "version": "0.5.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index f55803fc5c..f76d88bda7 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-github-deployments +## 0.1.46-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/integration-react@1.1.9 + ## 0.1.45 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index 523a7af480..c673adc712 100644 --- a/plugins/github-deployments/package.json +++ b/plugins/github-deployments/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-deployments", "description": "A Backstage plugin that integrates towards GitHub Deployments", - "version": "0.1.45", + "version": "0.1.46-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md index 5ba471e4ad..f87eef712c 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-github-issues +## 0.2.4-next.0 + +### Patch Changes + +- 3f88ae9d0a: Updated README.md examples to use correct components and fixed some syntax errors. +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.2.3 ### Patch Changes diff --git a/plugins/github-issues/README.md b/plugins/github-issues/README.md index d35f2c5d3f..f6b383bfcc 100644 --- a/plugins/github-issues/README.md +++ b/plugins/github-issues/README.md @@ -25,8 +25,8 @@ After installation, the plugin can be used as a Card or as a Page. ```typescript import { - GitHubIssuesCard, - GitHubIssuesPage, + GithubIssuesCard, + GithubIssuesPage, } from '@backstage/plugin-github-issues'; // To use as a page Plugin needs to be wrapped in EntityLayout.Route @@ -34,9 +34,9 @@ const RenderGitHubIssuesPage = () => ( - + - + ); @@ -46,17 +46,17 @@ const RenderGitHubIssuesCard = () => ( - + - + ); ``` ## Configuration -Both `GitHubIssuesPage` and `GitHubIssuesCard` provide default configuration. It is ready to use out of the box. +Both `GithubIssuesPage` and `GithubIssuesCard` provide default configuration. It is ready to use out of the box. However, you can configure the plugin with props: - `itemsPerPage: number = 10` - Issues in the list are paginated, number of issues on a single page is controlled with this prop @@ -67,7 +67,7 @@ However, you can configure the plugin with props: ### `filterBy` and `orderBy` example ```ts - ({ + items: [ + { + apiVersion: 'version', + kind: 'User', + metadata: { + annotations: { + 'kubernetes.io/api-server': 'https://apiserver.com', + 'kubernetes.io/api-server-certificate-authority': 'caData', + 'kubernetes.io/auth-provider': 'aws', + 'kubernetes.io/oidc-token-provider': 'google', + 'kubernetes.io/skip-metrics-lookup': 'true', + 'kubernetes.io/skip-tls-verify': 'true', + 'kubernetes.io/dashboard-url': 'my-url', + 'kubernetes.io/dashboard-app': 'my-app', + }, + name: 'owned', + namespace: 'default', + }, + }, + ], + }), +} as unknown as CatalogApi; + describe('CatalogClusterLocator', () => { - it('empty clusters returns empty cluster details', async () => { - const mockCatalogApi = { + it('returns empty cluster details when the cluster is empty', async () => { + const emptyMockCatalogApi = { getEntityByRef: jest.fn(), getEntities: async () => ({ - items: [ - { - apiVersion: 'version', - kind: 'User', - metadata: { - annotations: { - 'kubernetes.io/api-server': 'https://apiserver.com', - 'kubernetes.io/api-server-certificate-authority': 'caData', - 'kubernetes.io/auth-provider': 'aws', - }, - name: 'owned', - namespace: 'default', - }, - }, - ], + items: [], }), } as Partial as CatalogApi; - const sut = CatalogClusterLocator.fromConfig(mockCatalogApi); + const clusterSupplier = + CatalogClusterLocator.fromConfig(emptyMockCatalogApi); - const result = await sut.getClusters(); + const result = await clusterSupplier.getClusters(); + + expect(result).toHaveLength(0); + expect(result).toStrictEqual([]); + }); + + it('returns the cluster details provided by annotations', async () => { + const clusterSupplier = CatalogClusterLocator.fromConfig(mockCatalogApi); + + const result = await clusterSupplier.getClusters(); expect(result).toHaveLength(1); - expect(result[0]).toMatchObject({ + expect(result[0]).toStrictEqual({ name: 'owned', url: 'https://apiserver.com', caData: 'caData', authProvider: 'aws', + oidcTokenProvider: 'google', + skipMetricsLookup: true, + skipTLSVerify: true, + dashboardUrl: 'my-url', + dashboardApp: 'my-app', }); }); }); diff --git a/plugins/kubernetes-backend/src/cluster-locator/CatalogClusterLocator.ts b/plugins/kubernetes-backend/src/cluster-locator/CatalogClusterLocator.ts index 7183b71831..b952aefccf 100644 --- a/plugins/kubernetes-backend/src/cluster-locator/CatalogClusterLocator.ts +++ b/plugins/kubernetes-backend/src/cluster-locator/CatalogClusterLocator.ts @@ -20,7 +20,12 @@ import { ANNOTATION_KUBERNETES_API_SERVER, ANNOTATION_KUBERNETES_API_SERVER_CA, ANNOTATION_KUBERNETES_AUTH_PROVIDER, -} from '@backstage/catalog-model'; + ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER, + ANNOTATION_KUBERNETES_SKIP_METRICS_LOOKUP, + ANNOTATION_KUBERNETES_SKIP_TLS_VERIFY, + ANNOTATION_KUBERNETES_DASHBOARD_URL, + ANNOTATION_KUBERNETES_DASHBOARD_APP, +} from '@backstage/plugin-kubernetes-common'; export class CatalogClusterLocator implements KubernetesClustersSupplier { private catalogClient: CatalogApi; @@ -57,6 +62,26 @@ export class CatalogClusterLocator implements KubernetesClustersSupplier { entity.metadata.annotations![ANNOTATION_KUBERNETES_API_SERVER_CA]!, authProvider: entity.metadata.annotations![ANNOTATION_KUBERNETES_AUTH_PROVIDER]!, + oidcTokenProvider: + entity.metadata.annotations![ + ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER + ]!, + skipMetricsLookup: + entity.metadata.annotations![ + ANNOTATION_KUBERNETES_SKIP_METRICS_LOOKUP + ]! === 'true' + ? true + : false, + skipTLSVerify: + entity.metadata.annotations![ + ANNOTATION_KUBERNETES_SKIP_TLS_VERIFY + ]! === 'true' + ? true + : false, + dashboardUrl: + entity.metadata.annotations![ANNOTATION_KUBERNETES_DASHBOARD_URL]!, + dashboardApp: + entity.metadata.annotations![ANNOTATION_KUBERNETES_DASHBOARD_APP]!, }; return clusterDetails; diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 26e2cb3c47..ec5b17df99 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-kubernetes-common +## 0.6.0-next.0 + +### Minor Changes + +- 1728c1ef01: **BREAKING**: Renamed misspelled `LimitRangeFetchReponse` to `LimitRangeFetchResponse`. + +### Patch Changes + +- 2518ef5b8a: New K8s catalog entity annotations added that will replace now deprecated k8s annotations in the catalog-model package. K8s annotation imports should now be made from plugin-kubernetes-common. +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + ## 0.5.1 ### Patch Changes diff --git a/plugins/kubernetes-common/api-report.md b/plugins/kubernetes-common/api-report.md index 7051886ae7..fb41895f1a 100644 --- a/plugins/kubernetes-common/api-report.md +++ b/plugins/kubernetes-common/api-report.md @@ -19,6 +19,37 @@ import { V1ReplicaSet } from '@kubernetes/client-node'; import { V1Service } from '@kubernetes/client-node'; import { V1StatefulSet } from '@kubernetes/client-node'; +// @public +export const ANNOTATION_KUBERNETES_API_SERVER = 'kubernetes.io/api-server'; + +// @public +export const ANNOTATION_KUBERNETES_API_SERVER_CA = + 'kubernetes.io/api-server-certificate-authority'; + +// @public +export const ANNOTATION_KUBERNETES_AUTH_PROVIDER = + 'kubernetes.io/auth-provider'; + +// @public +export const ANNOTATION_KUBERNETES_DASHBOARD_APP = + 'kubernetes.io/dashboard-app'; + +// @public +export const ANNOTATION_KUBERNETES_DASHBOARD_URL = + 'kubernetes.io/dashboard-url'; + +// @public +export const ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER = + 'kubernetes.io/oidc-token-provider'; + +// @public +export const ANNOTATION_KUBERNETES_SKIP_METRICS_LOOKUP = + 'kubernetes.io/skip-metrics-lookup'; + +// @public +export const ANNOTATION_KUBERNETES_SKIP_TLS_VERIFY = + 'kubernetes.io/skip-tls-verify'; + // @public (undocumented) export type AuthProviderType = 'google' | 'serviceAccount' | 'aws' | 'azure'; diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index faae062de2..23dd9eeae5 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-common", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", - "version": "0.5.1", + "version": "0.6.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -39,7 +39,7 @@ }, "dependencies": { "@backstage/catalog-model": "workspace:^", - "@kubernetes/client-node": "0.18.0" + "@kubernetes/client-node": "0.18.1" }, "devDependencies": { "@backstage/cli": "workspace:^" diff --git a/plugins/kubernetes-common/src/catalog-entity-constants.ts b/plugins/kubernetes-common/src/catalog-entity-constants.ts new file mode 100644 index 0000000000..a1a1996777 --- /dev/null +++ b/plugins/kubernetes-common/src/catalog-entity-constants.ts @@ -0,0 +1,78 @@ +/* + * 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. + */ + +/** + * Annotation for specifying the API server of a Kubernetes cluster + * + * @public + */ +export const ANNOTATION_KUBERNETES_API_SERVER = 'kubernetes.io/api-server'; + +/** + * Annotation for specifying the Certificate Authority of an API server for a Kubernetes cluster + * + * @public + */ +export const ANNOTATION_KUBERNETES_API_SERVER_CA = + 'kubernetes.io/api-server-certificate-authority'; + +/** + * Annotation for specifying the auth provider for a Kubernetes cluster + * + * @public + */ +export const ANNOTATION_KUBERNETES_AUTH_PROVIDER = + 'kubernetes.io/auth-provider'; + +/** + * Annotation for specifying the oidc provider used to get id tokens for a Kubernetes cluster + * + * @public + */ +export const ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER = + 'kubernetes.io/oidc-token-provider'; + +/** + * Annotation for specifying boolean value for skip metric lookup. + * + * @public + */ +export const ANNOTATION_KUBERNETES_SKIP_METRICS_LOOKUP = + 'kubernetes.io/skip-metrics-lookup'; + +/** + * Annotation for specifying boolean value for skip tls verify. + * + * @public + */ +export const ANNOTATION_KUBERNETES_SKIP_TLS_VERIFY = + 'kubernetes.io/skip-tls-verify'; + +/** + * Annotation for specifying the dashboard url for a Kubernetes cluster. + * + * @public + */ +export const ANNOTATION_KUBERNETES_DASHBOARD_URL = + 'kubernetes.io/dashboard-url'; + +/** + * Annotation for specifying the dashboard app for a Kubernetes cluster. + * + * @public + */ +export const ANNOTATION_KUBERNETES_DASHBOARD_APP = + 'kubernetes.io/dashboard-app'; diff --git a/plugins/kubernetes-common/src/index.ts b/plugins/kubernetes-common/src/index.ts index 6b97c0eb7d..ade73e4f79 100644 --- a/plugins/kubernetes-common/src/index.ts +++ b/plugins/kubernetes-common/src/index.ts @@ -21,3 +21,4 @@ */ export * from './types'; +export * from './catalog-entity-constants'; diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 1abf979827..b5d62408ad 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-kubernetes +## 0.7.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.6.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.7.7 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 8edbc3ae15..96a369dccf 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes", "description": "A Backstage plugin that integrates towards Kubernetes", - "version": "0.7.7", + "version": "0.7.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -40,7 +40,7 @@ "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", "@backstage/theme": "workspace:^", - "@kubernetes/client-node": "0.18.0", + "@kubernetes/client-node": "0.18.1", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", diff --git a/plugins/kubernetes/src/components/Cluster/Cluster.tsx b/plugins/kubernetes/src/components/Cluster/Cluster.tsx index 8998c68253..58025955b2 100644 --- a/plugins/kubernetes/src/components/Cluster/Cluster.tsx +++ b/plugins/kubernetes/src/components/Cluster/Cluster.tsx @@ -19,7 +19,6 @@ import { Accordion, AccordionDetails, AccordionSummary, - Divider, Grid, Typography, } from '@material-ui/core'; @@ -60,11 +59,12 @@ const ClusterSummary = ({ - {clusterName} - + {clusterName} + Cluster - - - {totalNumberOfPods} pods @@ -137,24 +135,36 @@ export const Cluster = ({ clusterObjects, podsWithErrors }: ClusterProps) => { - - - - - - - - - - - - - - - - - - + {groupedResponses.customResources.length > 0 ? ( + + + + ) : undefined} + {groupedResponses.deployments.length > 0 ? ( + + + + ) : undefined} + {groupedResponses.statefulsets.length > 0 ? ( + + + + ) : undefined} + {groupedResponses.ingresses.length > 0 ? ( + + + + ) : undefined} + {groupedResponses.services.length > 0 ? ( + + + + ) : undefined} + {groupedResponses.cronJobs.length > 0 ? ( + + + + ) : undefined} diff --git a/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsAccordions.tsx b/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsAccordions.tsx index ce2dc340e7..c5babe67fc 100644 --- a/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsAccordions.tsx +++ b/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsAccordions.tsx @@ -18,7 +18,6 @@ import { Accordion, AccordionDetails, AccordionSummary, - Divider, Grid, Typography, } from '@material-ui/core'; @@ -51,22 +50,21 @@ const CronJobSummary = ({ cronJob }: CronJobSummaryProps) => { - + - - - {cronJob.spec?.suspend ? ( @@ -92,7 +90,7 @@ const CronJobSummary = ({ cronJob }: CronJobSummaryProps) => { const CronJobAccordion = ({ cronJob, ownedJobs }: CronJobAccordionProps) => { return ( - + }> diff --git a/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsDrawer.tsx b/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsDrawer.tsx index 758f17ade0..0dc53396bb 100644 --- a/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsDrawer.tsx +++ b/plugins/kubernetes/src/components/CronJobsAccordions/CronJobsDrawer.tsx @@ -47,12 +47,12 @@ export const CronJobDrawer = ({ spacing={0} > - + {cronJob.metadata?.name ?? 'unknown object'} - + CronJob diff --git a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/Rollout.tsx b/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/Rollout.tsx index 185eeb771e..91039ec314 100644 --- a/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/Rollout.tsx +++ b/plugins/kubernetes/src/components/CustomResources/ArgoRollouts/Rollout.tsx @@ -19,7 +19,6 @@ import { Accordion, AccordionDetails, AccordionSummary, - Divider, Grid, Typography, } from '@material-ui/core'; @@ -101,15 +100,13 @@ const RolloutSummary = ({ - + - - - {hpa && ( @@ -149,7 +146,8 @@ const RolloutSummary = ({ xs={3} direction="column" justifyContent="flex-start" - alignItems="flex-start" + alignItems="flex-end" + spacing={0} > {numberOfCurrentPods} pods @@ -210,6 +208,7 @@ const RolloutAccordion = ({ }> - + {rollout.metadata?.name ?? 'unknown object'} - + Rollout diff --git a/plugins/kubernetes/src/components/CustomResources/DefaultCustomResource.tsx b/plugins/kubernetes/src/components/CustomResources/DefaultCustomResource.tsx index 36d38d3fe0..cee3fb9e6c 100644 --- a/plugins/kubernetes/src/components/CustomResources/DefaultCustomResource.tsx +++ b/plugins/kubernetes/src/components/CustomResources/DefaultCustomResource.tsx @@ -19,7 +19,6 @@ import { Accordion, AccordionDetails, AccordionSummary, - Divider, Grid, } from '@material-ui/core'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; @@ -54,18 +53,16 @@ const DefaultCustomResourceSummary = ({ - + - - - ); }; @@ -79,6 +76,7 @@ const DefaultCustomResourceAccordion = ({ }> - + {customResource.metadata?.name ?? 'unknown object'} - + {capitalizedName} diff --git a/plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentDrawer.tsx b/plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentDrawer.tsx index 6d25702d70..8be5ee1e46 100644 --- a/plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentDrawer.tsx +++ b/plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentDrawer.tsx @@ -58,12 +58,12 @@ export const DeploymentDrawer = ({ spacing={0} > - + {deployment.metadata?.name ?? 'unknown object'} - + Deployment diff --git a/plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx b/plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx index d2fb6275bc..8432b9d133 100644 --- a/plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx +++ b/plugins/kubernetes/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx @@ -19,7 +19,6 @@ import { Accordion, AccordionDetails, AccordionSummary, - Divider, Grid, Typography, } from '@material-ui/core'; @@ -72,17 +71,15 @@ const DeploymentSummary = ({ - + - - - {hpa && ( - + {numberOfCurrentPods} pods @@ -152,7 +150,7 @@ const DeploymentAccordion = ({ ); return ( - + }> { title="Error Reporting" data={errors} columns={columns} - options={{ paging: true, search: false }} + options={{ paging: true, search: false, emptyRowsWhenPaging: false }} /> )} diff --git a/plugins/kubernetes/src/components/IngressesAccordions/IngressDrawer.tsx b/plugins/kubernetes/src/components/IngressesAccordions/IngressDrawer.tsx index dc88987d53..ea79c1e4dc 100644 --- a/plugins/kubernetes/src/components/IngressesAccordions/IngressDrawer.tsx +++ b/plugins/kubernetes/src/components/IngressesAccordions/IngressDrawer.tsx @@ -43,12 +43,12 @@ export const IngressDrawer = ({ spacing={0} > - + {ingress.metadata?.name ?? 'unknown object'} - + Ingress diff --git a/plugins/kubernetes/src/components/IngressesAccordions/IngressesAccordions.tsx b/plugins/kubernetes/src/components/IngressesAccordions/IngressesAccordions.tsx index f6d6e4bf68..6e12c033ba 100644 --- a/plugins/kubernetes/src/components/IngressesAccordions/IngressesAccordions.tsx +++ b/plugins/kubernetes/src/components/IngressesAccordions/IngressesAccordions.tsx @@ -19,7 +19,6 @@ import { Accordion, AccordionDetails, AccordionSummary, - Divider, Grid, } from '@material-ui/core'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; @@ -46,13 +45,9 @@ const IngressSummary = ({ ingress }: IngressSummaryProps) => { justifyContent="flex-start" alignItems="center" > - + - - - - ); }; diff --git a/plugins/kubernetes/src/components/JobsAccordions/JobsAccordions.tsx b/plugins/kubernetes/src/components/JobsAccordions/JobsAccordions.tsx index 715be4c88a..e805e3664b 100644 --- a/plugins/kubernetes/src/components/JobsAccordions/JobsAccordions.tsx +++ b/plugins/kubernetes/src/components/JobsAccordions/JobsAccordions.tsx @@ -18,7 +18,6 @@ import { Accordion, AccordionDetails, AccordionSummary, - Divider, Grid, } from '@material-ui/core'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; @@ -54,22 +53,21 @@ const JobSummary = ({ job }: JobSummaryProps) => { - + - - - {job.status?.succeeded && Succeeded} @@ -89,7 +87,7 @@ const JobSummary = ({ job }: JobSummaryProps) => { const JobAccordion = ({ job, ownedPods }: JobAccordionProps) => { return ( - + }> diff --git a/plugins/kubernetes/src/components/JobsAccordions/JobsDrawer.tsx b/plugins/kubernetes/src/components/JobsAccordions/JobsDrawer.tsx index a7217725b2..b91fb15541 100644 --- a/plugins/kubernetes/src/components/JobsAccordions/JobsDrawer.tsx +++ b/plugins/kubernetes/src/components/JobsAccordions/JobsDrawer.tsx @@ -47,12 +47,12 @@ export const JobDrawer = ({ spacing={0} > - + {job.metadata?.name ?? 'unknown object'} - + Job diff --git a/plugins/kubernetes/src/components/Pods/PodsTable.tsx b/plugins/kubernetes/src/components/Pods/PodsTable.tsx index 1d2369e322..a6e4b33020 100644 --- a/plugins/kubernetes/src/components/Pods/PodsTable.tsx +++ b/plugins/kubernetes/src/components/Pods/PodsTable.tsx @@ -46,6 +46,7 @@ const DEFAULT_COLUMNS: TableColumn[] = [ { title: 'phase', render: (pod: V1Pod) => pod.status?.phase ?? 'unknown', + width: 'auto', }, { title: 'status', @@ -58,12 +59,14 @@ const READY: TableColumn[] = [ title: 'containers ready', align: 'center', render: containersReady, + width: 'auto', }, { title: 'total restarts', align: 'center', render: totalRestarts, type: 'numeric', + width: 'auto', }, ]; @@ -87,6 +90,7 @@ export const PodsTable = ({ pods, extraColumns = [] }: PodsTablesProps) => { return podStatusToCpuUtil(metrics); }, + width: 'auto', }, { title: 'Memory usage %', @@ -99,6 +103,7 @@ export const PodsTable = ({ pods, extraColumns = [] }: PodsTablesProps) => { return podStatusToMemoryUtil(metrics); }, + width: 'auto', }, ]; columns.push(...resourceColumns); @@ -109,11 +114,13 @@ export const PodsTable = ({ pods, extraColumns = [] }: PodsTablesProps) => { width: '100%', }; + const usePods = pods.map(p => ({ ...p, id: p.metadata?.uid })); + return (
diff --git a/plugins/kubernetes/src/components/ServicesAccordions/ServiceDrawer.tsx b/plugins/kubernetes/src/components/ServicesAccordions/ServiceDrawer.tsx index 5d17fd7213..a088c4792d 100644 --- a/plugins/kubernetes/src/components/ServicesAccordions/ServiceDrawer.tsx +++ b/plugins/kubernetes/src/components/ServicesAccordions/ServiceDrawer.tsx @@ -43,12 +43,12 @@ export const ServiceDrawer = ({ spacing={0} > - + {service.metadata?.name ?? 'unknown object'} - + Service diff --git a/plugins/kubernetes/src/components/ServicesAccordions/ServicesAccordions.tsx b/plugins/kubernetes/src/components/ServicesAccordions/ServicesAccordions.tsx index a51b93b3bc..f0cb99ec9c 100644 --- a/plugins/kubernetes/src/components/ServicesAccordions/ServicesAccordions.tsx +++ b/plugins/kubernetes/src/components/ServicesAccordions/ServicesAccordions.tsx @@ -19,7 +19,6 @@ import { Accordion, AccordionDetails, AccordionSummary, - Divider, Grid, Typography, } from '@material-ui/core'; @@ -38,17 +37,14 @@ const ServiceSummary = ({ service }: ServiceSummaryProps) => { - + - - - - Type: {service.spec?.type ?? '?'} @@ -95,7 +91,7 @@ type ServiceAccordionProps = { const ServiceAccordion = ({ service }: ServiceAccordionProps) => { return ( - + }> diff --git a/plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx b/plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx index 5dd3bafe37..e83c890426 100644 --- a/plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx +++ b/plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx @@ -59,12 +59,12 @@ export const StatefulSetDrawer = ({ spacing={0} > - + {statefulset.metadata?.name ?? 'unknown object'} - + Stateful Set diff --git a/plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx b/plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx index bb1c4821ba..37bb76c84e 100644 --- a/plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx +++ b/plugins/kubernetes/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx @@ -19,7 +19,6 @@ import { Accordion, AccordionDetails, AccordionSummary, - Divider, Grid, Typography, } from '@material-ui/core'; @@ -69,15 +68,13 @@ const StatefulSetSummary = ({ - + - - - {hpa && ( @@ -118,6 +115,7 @@ const StatefulSetSummary = ({ direction="column" justifyContent="flex-start" alignItems="flex-start" + spacing={0} > {numberOfCurrentPods} pods @@ -149,7 +147,7 @@ const StatefulSetAccordion = ({ ); return ( - + }> { diff --git a/plugins/scaffolder-backend-module-yeoman/src/actions/run/yeoman.ts b/plugins/scaffolder-backend-module-yeoman/src/actions/run/yeoman.ts index f7b0c54b41..89ea10b6a6 100644 --- a/plugins/scaffolder-backend-module-yeoman/src/actions/run/yeoman.ts +++ b/plugins/scaffolder-backend-module-yeoman/src/actions/run/yeoman.ts @@ -15,7 +15,7 @@ */ import { JsonObject } from '@backstage/types'; -import { createTemplateAction } from '@backstage/plugin-scaffolder-backend'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { yeomanRun } from './yeomanRun'; /** diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 6da85db1be..9bc5fc1e34 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-scaffolder-backend +## 1.11.0-next.0 + +### Minor Changes + +- 0b2952ee4b: Added the option to overwrite files in the `targetPath` of the `template:fetch` action + +### Patch Changes + +- ad3edc402d: **Deprecations**: The following are deprecated and should instead be imported from the new package `@backstage/plugin-scaffolder-node`: + + - `ActionContext` + - `createTemplateAction` + - `TaskSecrets` + - `TemplateAction` + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-backend@1.7.2-next.0 + - @backstage/plugin-catalog-node@1.3.3-next.0 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 + ## 1.10.0 ### Minor Changes diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 7f8ab0ad79..0d745862a1 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -5,6 +5,7 @@ ```ts /// +import { ActionContext as ActionContext_2 } from '@backstage/plugin-scaffolder-node'; import { BackendFeature } from '@backstage/backend-plugin-api'; import { CatalogApi } from '@backstage/catalog-client'; import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; @@ -24,38 +25,26 @@ import { Observable } from '@backstage/types'; import { Octokit } from 'octokit'; import { PluginDatabaseManager } from '@backstage/backend-common'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; -import { Schema } from 'jsonschema'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { ScmIntegrations } from '@backstage/integration'; import { SpawnOptionsWithoutStdio } from 'child_process'; +import { TaskSecrets as TaskSecrets_2 } from '@backstage/plugin-scaffolder-node'; import { TaskSpec } from '@backstage/plugin-scaffolder-common'; import { TaskSpecV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { TemplateInfo } from '@backstage/plugin-scaffolder-common'; +import { TemplateAction as TemplateAction_2 } from '@backstage/plugin-scaffolder-node'; import { UrlReader } from '@backstage/backend-common'; -import { UserEntity } from '@backstage/catalog-model'; import { Writable } from 'stream'; -// @public -export type ActionContext = { - logger: Logger; - logStream: Writable; - secrets?: TaskSecrets; - workspacePath: string; - input: Input; - output(name: string, value: JsonValue): void; - createTemporaryDirectory(): Promise; - templateInfo?: TemplateInfo; - isDryRun?: boolean; - user?: { - entity?: UserEntity; - ref?: string; - }; -}; +// @public @deprecated (undocumented) +export type ActionContext = ActionContext_2; + +// @alpha +export const catalogModuleTemplateKind: () => BackendFeature; // @public export const createBuiltinActions: ( options: CreateBuiltInActionsOptions, -) => TemplateAction[]; +) => TemplateAction_2[]; // @public export interface CreateBuiltInActionsOptions { @@ -72,7 +61,7 @@ export interface CreateBuiltInActionsOptions { export function createCatalogRegisterAction(options: { catalogClient: CatalogApi; integrations: ScmIntegrations; -}): TemplateAction< +}): TemplateAction_2< | { catalogInfoUrl: string; optional?: boolean | undefined; @@ -85,13 +74,13 @@ export function createCatalogRegisterAction(options: { >; // @public -export function createCatalogWriteAction(): TemplateAction<{ +export function createCatalogWriteAction(): TemplateAction_2<{ filePath?: string | undefined; entity: Entity; }>; // @public -export function createDebugLogAction(): TemplateAction<{ +export function createDebugLogAction(): TemplateAction_2<{ message?: string | undefined; listWorkspace?: boolean | undefined; }>; @@ -99,7 +88,7 @@ export function createDebugLogAction(): TemplateAction<{ // @public export function createFetchCatalogEntityAction(options: { catalogClient: CatalogApi; -}): TemplateAction<{ +}): TemplateAction_2<{ entityRef: string; optional?: boolean | undefined; }>; @@ -108,7 +97,7 @@ export function createFetchCatalogEntityAction(options: { export function createFetchPlainAction(options: { reader: UrlReader; integrations: ScmIntegrations; -}): TemplateAction<{ +}): TemplateAction_2<{ url: string; targetPath?: string | undefined; }>; @@ -119,7 +108,7 @@ export function createFetchTemplateAction(options: { integrations: ScmIntegrations; additionalTemplateFilters?: Record; additionalTemplateGlobals?: Record; -}): TemplateAction<{ +}): TemplateAction_2<{ url: string; targetPath?: string | undefined; values: any; @@ -131,12 +120,12 @@ export function createFetchTemplateAction(options: { }>; // @public -export const createFilesystemDeleteAction: () => TemplateAction<{ +export const createFilesystemDeleteAction: () => TemplateAction_2<{ files: string[]; }>; // @public -export const createFilesystemRenameAction: () => TemplateAction<{ +export const createFilesystemRenameAction: () => TemplateAction_2<{ files: Array<{ from: string; to: string; @@ -148,7 +137,7 @@ export const createFilesystemRenameAction: () => TemplateAction<{ export function createGithubActionsDispatchAction(options: { integrations: ScmIntegrations; githubCredentialsProvider?: GithubCredentialsProvider; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; workflowId: string; branchOrTagName: string; @@ -164,7 +153,7 @@ export function createGithubActionsDispatchAction(options: { export function createGithubIssuesLabelAction(options: { integrations: ScmIntegrationRegistry; githubCredentialsProvider?: GithubCredentialsProvider; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; number: number; labels: string[]; @@ -194,7 +183,7 @@ export type CreateGithubPullRequestClientFactoryInput = { export function createGithubRepoCreateAction(options: { integrations: ScmIntegrationRegistry; githubCredentialsProvider?: GithubCredentialsProvider; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; description?: string | undefined; homepage?: string | undefined; @@ -261,7 +250,7 @@ export function createGithubRepoPushAction(options: { integrations: ScmIntegrationRegistry; config: Config; githubCredentialsProvider?: GithubCredentialsProvider; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; description?: string | undefined; defaultBranch?: string | undefined; @@ -300,7 +289,7 @@ export function createGithubWebhookAction(options: { integrations: ScmIntegrationRegistry; defaultWebhookSecret?: string; githubCredentialsProvider?: GithubCredentialsProvider; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; webhookUrl: string; webhookSecret?: string | undefined; @@ -315,7 +304,7 @@ export function createGithubWebhookAction(options: { export function createPublishAzureAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; description?: string | undefined; defaultBranch?: string | undefined; @@ -330,7 +319,7 @@ export function createPublishAzureAction(options: { export function createPublishBitbucketAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; description?: string | undefined; defaultBranch?: string | undefined; @@ -347,7 +336,7 @@ export function createPublishBitbucketAction(options: { export function createPublishBitbucketCloudAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; description?: string | undefined; defaultBranch?: string | undefined; @@ -360,7 +349,7 @@ export function createPublishBitbucketCloudAction(options: { export function createPublishBitbucketServerAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; description?: string | undefined; defaultBranch?: string | undefined; @@ -377,7 +366,7 @@ export function createPublishBitbucketServerAction(options: { export function createPublishGerritAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; description: string; defaultBranch?: string | undefined; @@ -391,7 +380,7 @@ export function createPublishGerritAction(options: { export function createPublishGerritReviewAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; branch?: string | undefined; sourcePath?: string | undefined; @@ -405,7 +394,7 @@ export function createPublishGithubAction(options: { integrations: ScmIntegrationRegistry; config: Config; githubCredentialsProvider?: GithubCredentialsProvider; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; description?: string | undefined; homepage?: string | undefined; @@ -478,7 +467,7 @@ export const createPublishGithubPullRequestAction: ({ integrations, githubCredentialsProvider, clientFactory, -}: CreateGithubPullRequestActionOptions) => TemplateAction<{ +}: CreateGithubPullRequestActionOptions) => TemplateAction_2<{ title: string; branchName: string; description: string; @@ -495,7 +484,7 @@ export const createPublishGithubPullRequestAction: ({ export function createPublishGitlabAction(options: { integrations: ScmIntegrationRegistry; config: Config; -}): TemplateAction<{ +}): TemplateAction_2<{ repoUrl: string; defaultBranch?: string | undefined; repoVisibility?: 'internal' | 'private' | 'public' | undefined; @@ -511,7 +500,7 @@ export function createPublishGitlabAction(options: { // @public export const createPublishGitlabMergeRequestAction: (options: { integrations: ScmIntegrationRegistry; -}) => TemplateAction<{ +}) => TemplateAction_2<{ repoUrl: string; title: string; description: string; @@ -528,10 +517,10 @@ export const createPublishGitlabMergeRequestAction: (options: { // @public export function createRouter(options: RouterOptions): Promise; -// @public +// @public @deprecated (undocumented) export const createTemplateAction: ( - templateAction: TemplateAction, -) => TemplateAction; + templateAction: TemplateAction_2, +) => TemplateAction_2; // @public export type CreateWorkerOptions = { @@ -548,7 +537,7 @@ export type CreateWorkerOptions = { // @public export interface CurrentClaimedTask { createdBy?: string; - secrets?: TaskSecrets; + secrets?: TaskSecrets_2; spec: TaskSpec; taskId: string; } @@ -629,7 +618,7 @@ export type OctokitWithPullRequestPluginClient = Octokit & { // @public export interface RouterOptions { // (undocumented) - actions?: TemplateAction[]; + actions?: TemplateAction_2[]; // (undocumented) additionalTemplateFilters?: Record; // (undocumented) @@ -663,9 +652,6 @@ export type RunCommandOptions = { logStream?: Writable; }; -// @alpha -export const scaffolderCatalogModule: () => BackendFeature; - // @public (undocumented) export class ScaffolderEntitiesProcessor implements CatalogProcessor { // (undocumented) @@ -687,7 +673,7 @@ export const scaffolderPlugin: ( // @alpha export type ScaffolderPluginOptions = { - actions?: TemplateAction[]; + actions?: TemplateAction_2[]; taskWorkers?: number; taskBroker?: TaskBroker; additionalTemplateFilters?: Record; @@ -702,7 +688,7 @@ export type SerializedTask = { createdAt: string; lastHeartbeatAt?: string; createdBy?: string; - secrets?: TaskSecrets; + secrets?: TaskSecrets_2; }; // @public @@ -739,7 +725,7 @@ export interface TaskBroker { // @public export type TaskBrokerDispatchOptions = { spec: TaskSpec; - secrets?: TaskSecrets; + secrets?: TaskSecrets_2; createdBy?: string; }; @@ -766,7 +752,7 @@ export interface TaskContext { // (undocumented) isDryRun?: boolean; // (undocumented) - secrets?: TaskSecrets; + secrets?: TaskSecrets_2; // (undocumented) spec: TaskSpec; } @@ -793,15 +779,13 @@ export class TaskManager implements TaskContext { // (undocumented) getWorkspaceName(): Promise; // (undocumented) - get secrets(): TaskSecrets | undefined; + get secrets(): TaskSecrets_2 | undefined; // (undocumented) get spec(): TaskSpecV1beta3; } -// @public -export type TaskSecrets = Record & { - backstageToken?: string; -}; +// @public @deprecated (undocumented) +export type TaskSecrets = TaskSecrets_2; // @public export type TaskStatus = @@ -853,7 +837,7 @@ export interface TaskStore { export type TaskStoreCreateTaskOptions = { spec: TaskSpec; createdBy?: string; - secrets?: TaskSecrets; + secrets?: TaskSecrets_2; }; // @public @@ -890,30 +874,18 @@ export class TaskWorker { start(): void; } -// @public (undocumented) -export type TemplateAction = { - id: string; - description?: string; - examples?: { - description: string; - example: string; - }[]; - supportsDryRun?: boolean; - schema?: { - input?: Schema; - output?: Schema; - }; - handler: (ctx: ActionContext) => Promise; -}; +// @public @deprecated (undocumented) +export type TemplateAction = + TemplateAction_2; // @public export class TemplateActionRegistry { // (undocumented) - get(actionId: string): TemplateAction; + get(actionId: string): TemplateAction_2; // (undocumented) - list(): TemplateAction[]; + list(): TemplateAction_2[]; // (undocumented) - register(action: TemplateAction): void; + register(action: TemplateAction_2): void; } // @public (undocumented) diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 8a98ea4a3d..ad5edee668 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend", "description": "The Backstage backend plugin that helps you create new things", - "version": "1.10.0", + "version": "1.11.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -46,6 +46,7 @@ "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-scaffolder-common": "workspace:^", + "@backstage/plugin-scaffolder-node": "workspace:^", "@backstage/types": "workspace:^", "@gitbeaker/core": "^35.6.0", "@gitbeaker/node": "^35.1.0", diff --git a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts index 71472abda6..43b8d30f99 100644 --- a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts +++ b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts @@ -13,20 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { createBackendPlugin, coreServices, - createExtensionPoint, } from '@backstage/backend-plugin-api'; import { loggerToWinstonLogger } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; import { catalogServiceRef } from '@backstage/plugin-catalog-node'; +import { + scaffolderActionsExtensionPoint, + ScaffolderActionsExtensionPoint, + TemplateAction, +} from '@backstage/plugin-scaffolder-node'; import { TemplateFilter, TemplateGlobal } from './lib'; -import { createBuiltinActions, TaskBroker, TemplateAction } from './scaffolder'; +import { createBuiltinActions, TaskBroker } from './scaffolder'; import { createRouter } from './service/router'; /** * Catalog plugin options + * * @alpha */ export type ScaffolderPluginOptions = { @@ -37,37 +43,23 @@ export type ScaffolderPluginOptions = { additionalTemplateGlobals?: Record; }; -/** - * @alpha - * TODO: MOVE to scaffolder-node. - */ -interface ScaffolderActionsExtensionPoint { - addActions(...actions: TemplateAction[]): void; -} - class ScaffolderActionsExtensionPointImpl implements ScaffolderActionsExtensionPoint { #actions = new Array>(); + addActions(...actions: TemplateAction[]): void { this.#actions.push(...actions); } + get actions() { return this.#actions; } } -/** - * @alpha - * TODO: MOVE to scaffolder-node. - */ -export const scaffolderActionsExtensionPoint = - createExtensionPoint({ - id: 'scaffolder.actions', - }); - /** * Catalog plugin + * * @alpha */ export const scaffolderPlugin = createBackendPlugin( @@ -75,6 +67,7 @@ export const scaffolderPlugin = createBackendPlugin( id: 'scaffolder', register(env) { const actionsExtensions = new ScaffolderActionsExtensionPointImpl(); + env.registerExtensionPoint( scaffolderActionsExtensionPoint, actionsExtensions, diff --git a/plugins/scaffolder-backend/src/deprecated.ts b/plugins/scaffolder-backend/src/deprecated.ts new file mode 100644 index 0000000000..f8358b9071 --- /dev/null +++ b/plugins/scaffolder-backend/src/deprecated.ts @@ -0,0 +1,49 @@ +/* + * 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 { + ActionContext as ActionContextNode, + createTemplateAction as createTemplateActionNode, + TaskSecrets as TaskSecretsNode, + TemplateAction as TemplateActionNode, +} from '@backstage/plugin-scaffolder-node'; +import { JsonObject } from '@backstage/types'; + +/** + * @public + * @deprecated Import from {@link @backstage/plugin-scaffolder-node#ActionContext} instead + */ +export type ActionContext = + ActionContextNode; + +/** + * @public + * @deprecated Use `createTemplateAction` from `@backstage/plugin-scaffolder-node` instead + */ +export const createTemplateAction = createTemplateActionNode; + +/** + * @public + * @deprecated Use `TaskSecrets` from `@backstage/plugin-scaffolder-node` instead + */ +export type TaskSecrets = TaskSecretsNode; + +/** + * @public + * @deprecated Use `TemplateAction` from `@backstage/plugin-scaffolder-node` instead + */ +export type TemplateAction = + TemplateActionNode; diff --git a/plugins/scaffolder-backend/src/index.ts b/plugins/scaffolder-backend/src/index.ts index 985ada405e..ba69a55a24 100644 --- a/plugins/scaffolder-backend/src/index.ts +++ b/plugins/scaffolder-backend/src/index.ts @@ -24,6 +24,8 @@ export * from './scaffolder'; export * from './service/router'; export * from './lib'; export * from './processor'; -export * from './extension'; +export * from './modules'; export { scaffolderPlugin } from './ScaffolderPlugin'; export type { ScaffolderPluginOptions } from './ScaffolderPlugin'; + +export * from './deprecated'; diff --git a/plugins/scaffolder-backend/src/extension/ScaffolderCatalogModule.test.ts b/plugins/scaffolder-backend/src/modules/catalogModuleTemplateKind.test.ts similarity index 87% rename from plugins/scaffolder-backend/src/extension/ScaffolderCatalogModule.test.ts rename to plugins/scaffolder-backend/src/modules/catalogModuleTemplateKind.test.ts index 7d8c3cc140..7652f60386 100644 --- a/plugins/scaffolder-backend/src/extension/ScaffolderCatalogModule.test.ts +++ b/plugins/scaffolder-backend/src/modules/catalogModuleTemplateKind.test.ts @@ -16,15 +16,15 @@ import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node'; import { ScaffolderEntitiesProcessor } from '../processor'; -import { scaffolderCatalogModule } from './ScaffolderCatalogModule'; +import { catalogModuleTemplateKind } from './catalogModuleTemplateKind'; import { startTestBackend } from '@backstage/backend-test-utils'; -describe('ScaffolderCatalogModule', () => { +describe('catalogModuleTemplateKind', () => { it('should register the extension point', async () => { const extensionPoint = { addProcessor: jest.fn() }; await startTestBackend({ extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], - features: [scaffolderCatalogModule()], + features: [catalogModuleTemplateKind()], }); expect(extensionPoint.addProcessor).toHaveBeenCalledWith( diff --git a/plugins/scaffolder-backend/src/extension/ScaffolderCatalogModule.ts b/plugins/scaffolder-backend/src/modules/catalogModuleTemplateKind.ts similarity index 86% rename from plugins/scaffolder-backend/src/extension/ScaffolderCatalogModule.ts rename to plugins/scaffolder-backend/src/modules/catalogModuleTemplateKind.ts index 4e9b6f75c9..622e5a003a 100644 --- a/plugins/scaffolder-backend/src/extension/ScaffolderCatalogModule.ts +++ b/plugins/scaffolder-backend/src/modules/catalogModuleTemplateKind.ts @@ -13,17 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { createBackendModule } from '@backstage/backend-plugin-api'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node'; import { ScaffolderEntitiesProcessor } from '../processor'; /** + * Registers support for the Template kind to the catalog backend plugin. + * * @alpha - * Registers the ScaffolderEntitiesProcessor with the catalog processing extension point. */ -export const scaffolderCatalogModule = createBackendModule({ +export const catalogModuleTemplateKind = createBackendModule({ moduleId: 'scaffolder', - pluginId: 'catalog', + pluginId: 'templateKind', register(env) { env.registerInit({ deps: { diff --git a/plugins/scaffolder-backend/src/extension/index.ts b/plugins/scaffolder-backend/src/modules/index.ts similarity index 89% rename from plugins/scaffolder-backend/src/extension/index.ts rename to plugins/scaffolder-backend/src/modules/index.ts index c827d9cafd..993a66815a 100644 --- a/plugins/scaffolder-backend/src/extension/index.ts +++ b/plugins/scaffolder-backend/src/modules/index.ts @@ -13,4 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { scaffolderCatalogModule } from './ScaffolderCatalogModule'; + +export { catalogModuleTemplateKind } from './catalogModuleTemplateKind'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts b/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts index 8a2a00d121..d044d095cd 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts @@ -16,7 +16,7 @@ import { JsonObject } from '@backstage/types'; import { ConflictError, NotFoundError } from '@backstage/errors'; -import { TemplateAction } from './types'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; /** * Registry of all registered template actions. diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts index c45eb62fce..913bf32cce 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts @@ -15,7 +15,7 @@ */ import { CatalogApi } from '@backstage/catalog-client'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import yaml from 'yaml'; const id = 'catalog:fetch'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.ts index 48fec3db03..e866eb12ba 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.ts @@ -18,7 +18,7 @@ import { InputError } from '@backstage/errors'; import { ScmIntegrations } from '@backstage/integration'; import { CatalogApi } from '@backstage/catalog-client'; import { stringifyEntityRef } from '@backstage/catalog-model'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import yaml from 'yaml'; const id = 'catalog:register'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts index 5257839f2d..5c5a62956f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts @@ -15,7 +15,7 @@ */ import fs from 'fs-extra'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import * as yaml from 'yaml'; import { Entity } from '@backstage/catalog-model'; import { resolveSafeChildPath } from '@backstage/backend-common'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts index 7e954295a1..d83d9c5b07 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts @@ -23,6 +23,7 @@ import { ScmIntegrations, } from '@backstage/integration'; import { JsonObject } from '@backstage/types'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { createCatalogRegisterAction, createCatalogWriteAction, @@ -30,7 +31,6 @@ import { } from './catalog'; import { TemplateFilter, TemplateGlobal } from '../../../lib'; -import { TemplateAction } from '../types'; import { createDebugLogAction } from './debug'; import { createFetchPlainAction, createFetchTemplateAction } from './fetch'; import { diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts index 3863623563..481eb9dfdd 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts @@ -16,7 +16,7 @@ import { readdir, stat } from 'fs-extra'; import { relative, join } from 'path'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import yaml from 'yaml'; const id = 'debug:log'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts index 0469ffec06..ed37a39a98 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + jest.mock('./helpers'); import os from 'os'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts index b3b984f544..c10f696bb9 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts @@ -17,7 +17,7 @@ import { UrlReader, resolveSafeChildPath } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; import { fetchContents } from './helpers'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; /** * Downloads content and places it in the workspace, or optionally diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts index 6658e1915d..15548ffea7 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts @@ -26,8 +26,11 @@ import { import { ScmIntegrations } from '@backstage/integration'; import { PassThrough } from 'stream'; import { fetchContents } from './helpers'; -import { ActionContext, TemplateAction } from '../../types'; import { createFetchTemplateAction } from './template'; +import { + ActionContext, + TemplateAction, +} from '@backstage/plugin-scaffolder-node'; jest.mock('./helpers', () => ({ fetchContents: jest.fn(), diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts index 81b3f4577c..68c205ce59 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts @@ -19,7 +19,7 @@ import { resolveSafeChildPath, UrlReader } from '@backstage/backend-common'; import { InputError } from '@backstage/errors'; import { ScmIntegrations } from '@backstage/integration'; import { fetchContents } from './helpers'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import globby from 'globby'; import fs from 'fs-extra'; import { isBinaryFile } from 'isbinaryfile'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.ts index 757e9c682e..2f955c16ff 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.ts @@ -13,7 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { createTemplateAction } from '../../createTemplateAction'; + +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { InputError } from '@backstage/errors'; import { resolveSafeChildPath } from '@backstage/backend-common'; import fs from 'fs-extra'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.ts index 654ee7b150..c29ba221c4 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.ts @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { createTemplateAction } from '../../createTemplateAction'; -import { resolveSafeChildPath } from '@backstage/backend-common'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { resolveSafeChildPath } from '@backstage/backend-common'; import { InputError } from '@backstage/errors'; import fs from 'fs-extra'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubActionsDispatch.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubActionsDispatch.test.ts index 0782ea40cd..3d59e43695 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubActionsDispatch.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubActionsDispatch.test.ts @@ -14,9 +14,6 @@ * limitations under the License. */ -import { TemplateAction } from '../../types'; -import { createGithubActionsDispatchAction } from './githubActionsDispatch'; - import { ScmIntegrations, DefaultGithubCredentialsProvider, @@ -24,7 +21,9 @@ import { } from '@backstage/integration'; import { ConfigReader } from '@backstage/config'; import { getVoidLogger } from '@backstage/backend-common'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { PassThrough } from 'stream'; +import { createGithubActionsDispatchAction } from './githubActionsDispatch'; const mockOctokit = { rest: { diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubActionsDispatch.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubActionsDispatch.ts index b9d77559e0..cd1593ee9f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubActionsDispatch.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubActionsDispatch.ts @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { InputError } from '@backstage/errors'; import { GithubCredentialsProvider, ScmIntegrations, } from '@backstage/integration'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { Octokit } from 'octokit'; -import { createTemplateAction } from '../../createTemplateAction'; import { parseRepoUrl } from '../publish/util'; import { getOctokitOptions } from './helpers'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubIssuesLabel.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubIssuesLabel.test.ts index bc9b797000..a1a0274304 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubIssuesLabel.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubIssuesLabel.test.ts @@ -22,8 +22,8 @@ import { } from '@backstage/integration'; import { ConfigReader } from '@backstage/config'; import { getVoidLogger } from '@backstage/backend-common'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { PassThrough } from 'stream'; -import { TemplateAction } from '../../types'; const mockOctokit = { rest: { diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubIssuesLabel.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubIssuesLabel.ts index 9c849edb6f..2dad0aa33a 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubIssuesLabel.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubIssuesLabel.ts @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { GithubCredentialsProvider, ScmIntegrationRegistry, } from '@backstage/integration'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { assertError, InputError } from '@backstage/errors'; import { Octokit } from 'octokit'; import { getOctokitOptions } from './helpers'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts index 824db27e84..f15747fd6b 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { TemplateAction } from '../../types'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; jest.mock('../helpers'); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts index 835fc79238..b5f779b8a7 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { InputError } from '@backstage/errors'; import { GithubCredentialsProvider, ScmIntegrationRegistry, } from '@backstage/integration'; import { Octokit } from 'octokit'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { parseRepoUrl } from '../publish/util'; import { createGithubRepoWithCollaboratorsAndTopics, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.test.ts index 24777163d4..517347c733 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { TemplateAction } from '../../types'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; jest.mock('../helpers'); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts index 5a5ffc015c..6e3892cee5 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { Config } from '@backstage/config'; import { InputError } from '@backstage/errors'; import { @@ -20,7 +21,7 @@ import { ScmIntegrationRegistry, } from '@backstage/integration'; import { Octokit } from 'octokit'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { parseRepoUrl } from '../publish/util'; import { getOctokitOptions, initRepoPushAndProtect } from './helpers'; import * as inputProps from './inputProperties'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubWebhook.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubWebhook.test.ts index 97fdb3d634..7901210a6e 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubWebhook.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubWebhook.test.ts @@ -22,8 +22,8 @@ import { } from '@backstage/integration'; import { ConfigReader } from '@backstage/config'; import { getVoidLogger } from '@backstage/backend-common'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { PassThrough } from 'stream'; -import { TemplateAction } from '../../types'; const mockOctokit = { rest: { diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubWebhook.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubWebhook.ts index 4547ce4492..4d487befc7 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubWebhook.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubWebhook.ts @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { GithubCredentialsProvider, ScmIntegrationRegistry, } from '@backstage/integration'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { emitterEventNames } from '@octokit/webhooks'; import { assertError, InputError } from '@backstage/errors'; import { Octokit } from 'octokit'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.test.ts index ca5e40bdb0..2d2775572f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.test.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + jest.mock('azure-devops-node-api', () => ({ WebApi: jest.fn(), getPersonalAccessTokenHandler: jest.fn().mockReturnValue(() => {}), diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.ts index 60b13b717d..083c18c94f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.ts @@ -20,7 +20,7 @@ import { initRepoAndPush } from '../helpers'; import { GitRepositoryCreateOptions } from 'azure-devops-node-api/interfaces/GitInterfaces'; import { getPersonalAccessTokenHandler, WebApi } from 'azure-devops-node-api'; import { getRepoSourceDirectory, parseRepoUrl } from './util'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { Config } from '@backstage/config'; /** diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucket.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucket.ts index 8f72157fc2..74e5e8c1ab 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucket.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucket.ts @@ -19,9 +19,9 @@ import { BitbucketIntegrationConfig, ScmIntegrationRegistry, } from '@backstage/integration'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import fetch, { Response, RequestInit } from 'node-fetch'; import { initRepoAndPush } from '../helpers'; -import { createTemplateAction } from '../../createTemplateAction'; import { getRepoSourceDirectory, parseRepoUrl } from './util'; import { Config } from '@backstage/config'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketCloud.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketCloud.ts index 02e29c33de..2c17bf2dbb 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketCloud.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketCloud.ts @@ -16,9 +16,9 @@ import { InputError } from '@backstage/errors'; import { ScmIntegrationRegistry } from '@backstage/integration'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import fetch, { Response, RequestInit } from 'node-fetch'; import { initRepoAndPush } from '../helpers'; -import { createTemplateAction } from '../../createTemplateAction'; import { getRepoSourceDirectory, parseRepoUrl } from './util'; import { Config } from '@backstage/config'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServer.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServer.ts index 8c96c14463..f2f581eadb 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServer.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServer.ts @@ -19,9 +19,9 @@ import { getBitbucketServerRequestOptions, ScmIntegrationRegistry, } from '@backstage/integration'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import fetch, { Response, RequestInit } from 'node-fetch'; import { initRepoAndPush } from '../helpers'; -import { createTemplateAction } from '../../createTemplateAction'; import { getRepoSourceDirectory, parseRepoUrl } from './util'; import { Config } from '@backstage/config'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gerrit.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gerrit.ts index 83653b3052..b5bcc31c62 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gerrit.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gerrit.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import crypto from 'crypto'; import { InputError } from '@backstage/errors'; import { Config } from '@backstage/config'; @@ -21,7 +22,7 @@ import { getGerritRequestOptions, ScmIntegrationRegistry, } from '@backstage/integration'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { getRepoSourceDirectory, parseRepoUrl } from './util'; import fetch, { Response, RequestInit } from 'node-fetch'; import { initRepoAndPush } from '../helpers'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gerritReview.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gerritReview.ts index 17068654c0..73e74f5cbc 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gerritReview.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gerritReview.ts @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import crypto from 'crypto'; import { InputError } from '@backstage/errors'; import { Config } from '@backstage/config'; import { ScmIntegrationRegistry } from '@backstage/integration'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { getRepoSourceDirectory, parseRepoUrl } from './util'; import { commitAndPushRepo } from '../helpers'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts index c2681ed527..8ead489ea4 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { TemplateAction } from '../../types'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; jest.mock('../helpers'); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts index add6fcc79c..185239c73f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { Config } from '@backstage/config'; import { InputError } from '@backstage/errors'; import { @@ -20,7 +21,7 @@ import { ScmIntegrationRegistry, } from '@backstage/integration'; import { Octokit } from 'octokit'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { createGithubRepoWithCollaboratorsAndTopics, getOctokitOptions, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.test.ts index e6649d1ffe..70fff20446 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.test.ts @@ -20,11 +20,14 @@ import { GithubCredentialsProvider, ScmIntegrations, } from '@backstage/integration'; +import { + ActionContext, + TemplateAction, +} from '@backstage/plugin-scaffolder-node'; import mockFs from 'mock-fs'; import os from 'os'; import { resolve as resolvePath } from 'path'; import { Writable } from 'stream'; -import { ActionContext, TemplateAction } from '../../types'; import { createPublishGithubPullRequestAction, OctokitWithPullRequestPluginClient, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts index d0ee979be3..764354e8ec 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts @@ -20,11 +20,11 @@ import { GithubCredentialsProvider, ScmIntegrationRegistry, } from '@backstage/integration'; -import { createTemplateAction } from '../../createTemplateAction'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { Octokit } from 'octokit'; import { InputError, CustomErrorBase } from '@backstage/errors'; -import { createPullRequest } from 'octokit-plugin-create-pull-request'; import { resolveSafeChildPath } from '@backstage/backend-common'; +import { createPullRequest } from 'octokit-plugin-create-pull-request'; import { getOctokitOptions } from '../github/helpers'; import { SerializedFile, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.test.ts index dc1d26d416..a9c4522dd3 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.test.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + jest.mock('../helpers'); import { createPublishGitlabAction } from './gitlab'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts index 53669efd0b..2e7520b77f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlab.ts @@ -16,10 +16,10 @@ import { InputError } from '@backstage/errors'; import { ScmIntegrationRegistry } from '@backstage/integration'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { Gitlab } from '@gitbeaker/node'; import { initRepoAndPush } from '../helpers'; import { getRepoSourceDirectory, parseRepoUrl } from './util'; -import { createTemplateAction } from '../../createTemplateAction'; import { Config } from '@backstage/config'; /** diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.test.ts index d1888fd9d2..c3d0fe58f1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.test.ts @@ -16,11 +16,11 @@ import { getRootLogger } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import mockFs from 'mock-fs'; import os from 'os'; import { resolve as resolvePath } from 'path'; import { Writable } from 'stream'; -import { TemplateAction } from '../../types'; import { createPublishGitlabMergeRequestAction } from './gitlabMergeRequest'; const root = os.platform() === 'win32' ? 'C:\\root' : '/root'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts index 2a71c9f748..bb27410402 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts @@ -13,7 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { createTemplateAction } from '../../createTemplateAction'; + +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { Gitlab } from '@gitbeaker/node'; import { Types } from '@gitbeaker/core'; import path from 'path'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/index.ts index d5f77b7b6f..9ea0607f06 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/index.ts @@ -16,5 +16,3 @@ export * from './builtin'; export { TemplateActionRegistry } from './TemplateActionRegistry'; -export { createTemplateAction } from './createTemplateAction'; -export type { ActionContext, TemplateAction } from './types'; diff --git a/plugins/scaffolder-backend/src/scaffolder/dryrun/DecoratedActionsRegistry.ts b/plugins/scaffolder-backend/src/scaffolder/dryrun/DecoratedActionsRegistry.ts index 6f11d3b6e8..c02375554c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/dryrun/DecoratedActionsRegistry.ts +++ b/plugins/scaffolder-backend/src/scaffolder/dryrun/DecoratedActionsRegistry.ts @@ -14,8 +14,9 @@ * limitations under the License. */ +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { JsonObject } from '@backstage/types'; -import { TemplateAction, TemplateActionRegistry } from '../actions'; +import { TemplateActionRegistry } from '../actions'; /** @internal */ export class DecoratedActionsRegistry extends TemplateActionRegistry { diff --git a/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts b/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts index 17f9092bff..1929e3b8ac 100644 --- a/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts @@ -26,12 +26,15 @@ import { serializeDirectoryContents, } from '../../lib/files'; import { TemplateFilter, TemplateGlobal } from '../../lib/templating'; -import { createTemplateAction, TemplateActionRegistry } from '../actions'; +import { TemplateActionRegistry } from '../actions'; import { NunjucksWorkflowRunner } from '../tasks/NunjucksWorkflowRunner'; -import { TaskSecrets } from '../tasks/types'; import { DecoratedActionsRegistry } from './DecoratedActionsRegistry'; import fs from 'fs-extra'; import { resolveSafeChildPath } from '@backstage/backend-common'; +import { + createTemplateAction, + TaskSecrets, +} from '@backstage/plugin-scaffolder-node'; interface DryRunInput { spec: TaskSpec; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 24a35078e2..453cfae83b 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -22,8 +22,9 @@ import { NunjucksWorkflowRunner } from './NunjucksWorkflowRunner'; import { TemplateActionRegistry } from '../actions'; import { ScmIntegrations } from '@backstage/integration'; import { ConfigReader } from '@backstage/config'; -import { TaskContext, TaskSecrets } from './types'; +import { TaskContext } from './types'; import { TaskSpec } from '@backstage/plugin-scaffolder-common'; +import { TaskSecrets } from '@backstage/plugin-scaffolder-node'; import { UserEntity } from '@backstage/catalog-model'; // The Stream module is lazy loaded, so make sure it's in the module cache before mocking fs diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 5893a88485..516abe79e4 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -26,7 +26,7 @@ import { PassThrough } from 'stream'; import { generateExampleOutput, isTruthy } from './helper'; import { validate as validateJsonSchema } from 'jsonschema'; import { parseRepoUrl } from '../actions/builtin/publish/util'; -import { TemplateAction, TemplateActionRegistry } from '../actions'; +import { TemplateActionRegistry } from '../actions'; import { TemplateFilter, SecureTemplater, @@ -38,6 +38,7 @@ import { TaskSpecV1beta3, TaskStep, } from '@backstage/plugin-scaffolder-common'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { UserEntity } from '@backstage/catalog-model'; import { createCounterMetric, createHistogramMetric } from '../../util/metrics'; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts index 5eeb73711e..2255798d5c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts @@ -17,9 +17,10 @@ import { getVoidLogger, DatabaseManager } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { TaskSpec } from '@backstage/plugin-scaffolder-common'; +import { TaskSecrets } from '@backstage/plugin-scaffolder-node'; import { DatabaseTaskStore } from './DatabaseTaskStore'; import { StorageTaskBroker, TaskManager } from './StorageTaskBroker'; -import { TaskSecrets, SerializedTaskEvent } from './types'; +import { SerializedTaskEvent } from './types'; async function createStore(): Promise { const manager = DatabaseManager.fromConfig( diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index 7a015c111f..d01351d8ae 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -15,6 +15,7 @@ */ import { TaskSpec } from '@backstage/plugin-scaffolder-common'; +import { TaskSecrets } from '@backstage/plugin-scaffolder-node'; import { JsonObject, Observable } from '@backstage/types'; import { Logger } from 'winston'; import ObservableImpl from 'zen-observable'; @@ -25,7 +26,6 @@ import { TaskBrokerDispatchOptions, TaskCompletionState, TaskContext, - TaskSecrets, TaskStore, } from './types'; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts index 2af7d6a340..f1c1a7bdac 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/index.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + export { DatabaseTaskStore } from './DatabaseTaskStore'; export type { DatabaseTaskStoreOptions } from './DatabaseTaskStore'; export { TaskManager } from './StorageTaskBroker'; @@ -20,7 +21,6 @@ export type { CurrentClaimedTask } from './StorageTaskBroker'; export { TaskWorker } from './TaskWorker'; export type { CreateWorkerOptions } from './TaskWorker'; export type { - TaskSecrets, TaskCompletionState, TaskStoreEmitOptions, TaskStoreListEventsOptions, diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index 5d3f8113ee..89f6c3e213 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -16,6 +16,7 @@ import { JsonValue, JsonObject, Observable } from '@backstage/types'; import { TaskSpec } from '@backstage/plugin-scaffolder-common'; +import { TaskSecrets } from '@backstage/plugin-scaffolder-node'; /** * The status of each step of the Task @@ -71,15 +72,6 @@ export type SerializedTaskEvent = { createdAt: string; }; -/** - * TaskSecrets - * - * @public - */ -export type TaskSecrets = Record & { - backstageToken?: string; -}; - /** * The result of {@link TaskBroker.dispatch} * diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 9ff8d43625..c339de8d10 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -43,7 +43,6 @@ import { DatabaseTaskStore, TaskBroker, TaskWorker, - TemplateAction, TemplateActionRegistry, } from '../scaffolder'; import { createDryRunner } from '../scaffolder/dryrun'; @@ -53,6 +52,7 @@ import { IdentityApi, IdentityApiGetIdentityRequest, } from '@backstage/plugin-auth-node'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; /** * RouterOptions diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index a74ea5b13e..4b7444994a 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-scaffolder-common +## 1.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + ## 1.2.4 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index e1ba605c30..bf8c32d5d1 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-common", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", - "version": "1.2.4", + "version": "1.2.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-node/.eslintrc.js b/plugins/scaffolder-node/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/scaffolder-node/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md new file mode 100644 index 0000000000..a447f09770 --- /dev/null +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -0,0 +1,14 @@ +# @backstage/plugin-scaffolder-node + +## 0.1.0-next.0 + +### Minor Changes + +- d72866f0cc: New package that takes over some of the types and functionality from `@backstage/plugin-scaffolder-backend` that are shared with other modules + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + - @backstage/backend-plugin-api@0.3.2-next.0 diff --git a/plugins/scaffolder-node/README.md b/plugins/scaffolder-node/README.md new file mode 100644 index 0000000000..8b52daa785 --- /dev/null +++ b/plugins/scaffolder-node/README.md @@ -0,0 +1,3 @@ +# plugin-scaffolder-node + +Houses types and utilities for building scaffolder-related modules. diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md new file mode 100644 index 0000000000..506ea0517d --- /dev/null +++ b/plugins/scaffolder-node/api-report.md @@ -0,0 +1,68 @@ +## API Report File for "@backstage/plugin-scaffolder-node" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// + +import { ExtensionPoint } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; +import { JsonValue } from '@backstage/types'; +import { Logger } from 'winston'; +import { Schema } from 'jsonschema'; +import { TemplateInfo } from '@backstage/plugin-scaffolder-common'; +import { UserEntity } from '@backstage/catalog-model'; +import { Writable } from 'stream'; + +// @public +export type ActionContext = { + logger: Logger; + logStream: Writable; + secrets?: TaskSecrets; + workspacePath: string; + input: TInput; + output(name: string, value: JsonValue): void; + createTemporaryDirectory(): Promise; + templateInfo?: TemplateInfo; + isDryRun?: boolean; + user?: { + entity?: UserEntity; + ref?: string; + }; +}; + +// @public +export const createTemplateAction: ( + templateAction: TemplateAction, +) => TemplateAction; + +// @alpha +export interface ScaffolderActionsExtensionPoint { + // (undocumented) + addActions(...actions: TemplateAction[]): void; +} + +// @alpha +export const scaffolderActionsExtensionPoint: ExtensionPoint; + +// @public +export type TaskSecrets = Record & { + backstageToken?: string; +}; + +// @public (undocumented) +export type TemplateAction = { + id: string; + description?: string; + examples?: { + description: string; + example: string; + }[]; + supportsDryRun?: boolean; + schema?: { + input?: Schema; + output?: Schema; + }; + handler: (ctx: ActionContext) => Promise; +}; +``` diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json new file mode 100644 index 0000000000..f67fe89623 --- /dev/null +++ b/plugins/scaffolder-node/package.json @@ -0,0 +1,41 @@ +{ + "name": "@backstage/plugin-scaffolder-node", + "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", + "version": "0.1.0-next.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "alphaTypes": "dist/index.alpha.d.ts", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "node-library" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build --experimental-type-build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/catalog-model": "workspace:^", + "@backstage/plugin-scaffolder-common": "workspace:^", + "@backstage/types": "workspace:^", + "jsonschema": "^1.2.6", + "winston": "^3.2.1" + }, + "devDependencies": { + "@backstage/cli": "workspace:^" + }, + "files": [ + "alpha", + "dist" + ] +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/createTemplateAction.ts b/plugins/scaffolder-node/src/actions/createTemplateAction.ts similarity index 99% rename from plugins/scaffolder-backend/src/scaffolder/actions/createTemplateAction.ts rename to plugins/scaffolder-node/src/actions/createTemplateAction.ts index 8893fa0f20..24d88a1681 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/createTemplateAction.ts +++ b/plugins/scaffolder-node/src/actions/createTemplateAction.ts @@ -19,6 +19,7 @@ import { TemplateAction } from './types'; /** * This function is used to create new template actions to get type safety. + * * @public */ export const createTemplateAction = ( diff --git a/plugins/scaffolder-node/src/actions/index.ts b/plugins/scaffolder-node/src/actions/index.ts new file mode 100644 index 0000000000..7fdee6d692 --- /dev/null +++ b/plugins/scaffolder-node/src/actions/index.ts @@ -0,0 +1,18 @@ +/* + * 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. + */ + +export { createTemplateAction } from './createTemplateAction'; +export { type ActionContext, type TemplateAction } from './types'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/types.ts b/plugins/scaffolder-node/src/actions/types.ts similarity index 87% rename from plugins/scaffolder-backend/src/scaffolder/actions/types.ts rename to plugins/scaffolder-node/src/actions/types.ts index 0912cc038b..5a4f5796a1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/types.ts +++ b/plugins/scaffolder-node/src/actions/types.ts @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Backstage Authors + * 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. @@ -18,7 +18,7 @@ import { Logger } from 'winston'; import { Writable } from 'stream'; import { JsonValue, JsonObject } from '@backstage/types'; import { Schema } from 'jsonschema'; -import { TaskSecrets } from '../tasks'; +import { TaskSecrets } from '../tasks/types'; import { TemplateInfo } from '@backstage/plugin-scaffolder-common'; import { UserEntity } from '@backstage/catalog-model'; @@ -26,12 +26,12 @@ import { UserEntity } from '@backstage/catalog-model'; * ActionContext is passed into scaffolder actions. * @public */ -export type ActionContext = { +export type ActionContext = { logger: Logger; logStream: Writable; secrets?: TaskSecrets; workspacePath: string; - input: Input; + input: TInput; output(name: string, value: JsonValue): void; /** @@ -63,7 +63,7 @@ export type ActionContext = { }; /** @public */ -export type TemplateAction = { +export type TemplateAction = { id: string; description?: string; examples?: { description: string; example: string }[]; @@ -72,5 +72,5 @@ export type TemplateAction = { input?: Schema; output?: Schema; }; - handler: (ctx: ActionContext) => Promise; + handler: (ctx: ActionContext) => Promise; }; diff --git a/plugins/scaffolder-node/src/extensions.ts b/plugins/scaffolder-node/src/extensions.ts new file mode 100644 index 0000000000..a706101043 --- /dev/null +++ b/plugins/scaffolder-node/src/extensions.ts @@ -0,0 +1,37 @@ +/* + * 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 { createExtensionPoint } from '@backstage/backend-plugin-api'; +import { TemplateAction } from './actions'; + +/** + * Extension point for managing scaffolder actions. + * + * @alpha + */ +export interface ScaffolderActionsExtensionPoint { + addActions(...actions: TemplateAction[]): void; +} + +/** + * Extension point for managing scaffolder actions. + * + * @alpha + */ +export const scaffolderActionsExtensionPoint = + createExtensionPoint({ + id: 'scaffolder.actions', + }); diff --git a/plugins/scaffolder/src/layouts/types.ts b/plugins/scaffolder-node/src/index.ts similarity index 59% rename from plugins/scaffolder/src/layouts/types.ts rename to plugins/scaffolder-node/src/index.ts index 94186d82bf..2a7c06234e 100644 --- a/plugins/scaffolder/src/layouts/types.ts +++ b/plugins/scaffolder-node/src/index.ts @@ -13,21 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import type { FormProps } from '@rjsf/core'; /** - * The field template from \@rjsf/core which is a react component that gets passed \@rjsf/core field related props. + * The scaffolder-node module for `@backstage/plugin-scaffolder-backend`. * - * @public + * @packageDocumentation */ -export type LayoutTemplate = FormProps['ObjectFieldTemplate']; -/** - * The type of layouts that is passed to the TemplateForms - * - * @public - */ -export interface LayoutOptions

{ - name: string; - component: LayoutTemplate

; -} +export * from './actions'; +export * from './tasks'; +export { + scaffolderActionsExtensionPoint, + type ScaffolderActionsExtensionPoint, +} from './extensions'; diff --git a/plugins/scaffolder-node/src/setupTests.ts b/plugins/scaffolder-node/src/setupTests.ts new file mode 100644 index 0000000000..d3232290a7 --- /dev/null +++ b/plugins/scaffolder-node/src/setupTests.ts @@ -0,0 +1,17 @@ +/* + * 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 {}; diff --git a/plugins/scaffolder-node/src/tasks/index.ts b/plugins/scaffolder-node/src/tasks/index.ts new file mode 100644 index 0000000000..0c1d0d813e --- /dev/null +++ b/plugins/scaffolder-node/src/tasks/index.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ + +export { type TaskSecrets } from './types'; diff --git a/plugins/scaffolder-node/src/tasks/types.ts b/plugins/scaffolder-node/src/tasks/types.ts new file mode 100644 index 0000000000..c17b3cbde3 --- /dev/null +++ b/plugins/scaffolder-node/src/tasks/types.ts @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/** + * TaskSecrets + * + * @public + */ +export type TaskSecrets = Record & { + backstageToken?: string; +}; diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 013cd393a3..c57b102949 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-scaffolder-react +## 1.1.0-next.0 + +### Minor Changes + +- 8c2966536b: Embed scaffolder workflow in other components + +### Patch Changes + +- cbab8ac107: lock versions of `@rjsf/*-beta` packages +- d2ddde2108: Add `ScaffolderLayouts` to `NextScaffolderPage` +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + ## 1.0.0 ### Major Changes diff --git a/plugins/scaffolder-react/api-report.md b/plugins/scaffolder-react/api-report.md index 85ba2c937a..deead4366c 100644 --- a/plugins/scaffolder-react/api-report.md +++ b/plugins/scaffolder-react/api-report.md @@ -65,6 +65,11 @@ export function createScaffolderFieldExtension< options: FieldExtensionOptions, ): Extension>; +// @public +export function createScaffolderLayout( + options: LayoutOptions, +): Extension>; + // @public export type CustomFieldExtensionSchema = { returnValue: JSONSchema7; @@ -116,12 +121,28 @@ export type FieldExtensionOptions< schema?: CustomFieldExtensionSchema; }; -// @alpha +// @public export type FormProps = Pick< FormProps_2, 'transformErrors' | 'noHtml5Validate' >; +// @public +export type LayoutComponent<_TInputProps> = () => null; + +// @public +export interface LayoutOptions

{ + // (undocumented) + component: LayoutTemplate

; + // (undocumented) + name: string; +} + +// @public +export type LayoutTemplate = NonNullable< + FormProps_2['uiSchema'] +>['ui:ObjectFieldTemplate']; + // @public export type ListActionsResponse = Array; @@ -276,6 +297,9 @@ export interface ScaffolderGetIntegrationsListResponse { }[]; } +// @public +export const ScaffolderLayouts: React.ComponentType; + // @public (undocumented) export type ScaffolderOutputLink = { title?: string; @@ -361,6 +385,7 @@ export type StepperProps = { createButtonText?: ReactNode; reviewButtonText?: ReactNode; }; + layouts?: LayoutOptions[]; }; // @alpha @@ -422,6 +447,11 @@ export const useCustomFieldExtensions: < outlet: React.ReactNode, ) => TComponentDataType[]; +// @public +export const useCustomLayouts: >( + outlet: React.ReactNode, +) => TComponentDataType[]; + // @alpha export const useFormDataFromQuery: ( initialState?: Record, @@ -454,7 +484,12 @@ export type WorkflowProps = { onError(error: Error | undefined): JSX.Element | null; } & Pick< StepperProps, - 'extensions' | 'FormProps' | 'components' | 'onCreate' | 'initialState' + | 'extensions' + | 'FormProps' + | 'components' + | 'onCreate' + | 'initialState' + | 'layouts' >; // (No @packageDocumentation comment for this package) diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 93ffd18d51..dbd64d1f2d 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-react", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", - "version": "1.0.0", + "version": "1.1.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -47,11 +47,11 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", "@rjsf/core": "^3.2.1", - "@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.16", + "@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.18", "@rjsf/material-ui": "^3.2.1", - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.0.0-beta.16", - "@rjsf/utils": "5.0.0-beta.16", - "@rjsf/validator-ajv6": "5.0.0-beta.16", + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.0.0-beta.18", + "@rjsf/utils": "5.0.0-beta.18", + "@rjsf/validator-ajv8": "5.0.0-beta.18", "@types/json-schema": "^7.0.9", "classnames": "^2.2.6", "json-schema": "^0.4.0", diff --git a/plugins/scaffolder-react/src/extensions/index.tsx b/plugins/scaffolder-react/src/extensions/index.tsx index 33442f6697..d70f5e36c5 100644 --- a/plugins/scaffolder-react/src/extensions/index.tsx +++ b/plugins/scaffolder-react/src/extensions/index.tsx @@ -25,7 +25,8 @@ import { Extension, attachComponentData } from '@backstage/core-plugin-api'; import { FIELD_EXTENSION_KEY, FIELD_EXTENSION_WRAPPER_KEY } from './keys'; /** - * A type used to wrap up the FieldExtension to embed the ReturnValue and the InputProps + * The type used to wrap up the Layout and embed the input props + * * @public */ export type FieldExtensionComponent<_TReturnValue, _TInputProps> = () => null; diff --git a/plugins/scaffolder-react/src/hooks/index.ts b/plugins/scaffolder-react/src/hooks/index.ts index 022fe7c38c..af64a9eebc 100644 --- a/plugins/scaffolder-react/src/hooks/index.ts +++ b/plugins/scaffolder-react/src/hooks/index.ts @@ -15,3 +15,4 @@ */ export { useCustomFieldExtensions } from './useCustomFieldExtensions'; +export { useCustomLayouts } from './useCustomLayouts'; diff --git a/plugins/scaffolder-react/src/hooks/useCustomLayouts.ts b/plugins/scaffolder-react/src/hooks/useCustomLayouts.ts new file mode 100644 index 0000000000..afcc45cd48 --- /dev/null +++ b/plugins/scaffolder-react/src/hooks/useCustomLayouts.ts @@ -0,0 +1,36 @@ +/* + * 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 { useElementFilter } from '@backstage/core-plugin-api'; +import { LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from '../next/layouts/keys'; +import { type LayoutOptions } from '../next/types'; + +/** + * Hook that returns all custom field extensions from the current outlet. + * @public + */ +export const useCustomLayouts = ( + outlet: React.ReactNode, +) => { + return useElementFilter(outlet, elements => + elements + .selectByComponentData({ + key: LAYOUTS_WRAPPER_KEY, + }) + .findComponentData({ + key: LAYOUTS_KEY, + }), + ); +}; diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx index 5dbce3243f..5995d0e419 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx @@ -21,6 +21,7 @@ import { act, fireEvent } from '@testing-library/react'; import type { RJSFValidationError } from '@rjsf/utils'; import { JsonValue } from '@backstage/types'; import { NextFieldExtensionComponentProps } from '../../extensions'; +import { LayoutTemplate } from '../../types'; describe('Stepper', () => { it('should render the step titles for each step of the manifest', async () => { @@ -392,4 +393,47 @@ describe('Stepper', () => { await fireEvent.click(getByRole('button', { name: 'Make' })); }); }); + + describe('Scaffolder Layouts', () => { + it('should render the step in the scaffolder layout', async () => { + const ScaffolderLayout: LayoutTemplate = ({ properties }) => ( + <> +

A Scaffolder Layout

+ {properties.map((prop, i) => ( +
{prop.content}
+ ))} + + ); + + const manifest: TemplateParameterSchema = { + steps: [ + { + title: 'Step 1', + schema: { + type: 'object', + 'ui:ObjectFieldTemplate': 'Layout', + properties: { + field1: { + type: 'string', + }, + }, + }, + }, + ], + title: 'scaffolder layouts', + }; + + const { getByText, getByRole } = await renderInTestApp( + , + ); + + expect(getByText('A Scaffolder Layout')).toBeInTheDocument(); + expect(getByRole('textbox', { name: 'field1' })).toBeInTheDocument(); + }); + }); }); diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx index 950c9720de..096173deb7 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx @@ -28,11 +28,12 @@ import React, { useCallback, useMemo, useState, type ReactNode } from 'react'; import { NextFieldExtensionOptions } from '../../extensions'; import { TemplateParameterSchema } from '../../../types'; import { createAsyncValidators } from './createAsyncValidators'; -import type { FormProps } from '../../types'; import { ReviewState, type ReviewStateProps } from '../ReviewState'; import { useTemplateSchema } from '../../hooks/useTemplateSchema'; -import { useFormDataFromQuery } from '../../hooks/useFormDataFromQuery'; -import validator from '@rjsf/validator-ajv6'; +import validator from '@rjsf/validator-ajv8'; +import { useFormDataFromQuery } from '../../hooks'; +import type { FormProps, LayoutOptions } from '../../types'; +import { useTransformSchemaToProps } from '../../hooks/useTransformSchemaToProps'; const useStyles = makeStyles(theme => ({ backButton: { @@ -65,6 +66,7 @@ export type StepperProps = { createButtonText?: ReactNode; reviewButtonText?: ReactNode; }; + layouts?: LayoutOptions[]; }; // TODO(blam): We require here, as the types in this package depend on @rjsf/core explicitly @@ -76,15 +78,13 @@ const Form = withTheme(require('@rjsf/material-ui-v5').Theme); * The `Stepper` component is the Wizard that is rendered when a user selects a template * @alpha */ - export const Stepper = (stepperProps: StepperProps) => { - const { components = {}, ...props } = stepperProps; + const { layouts = [], components = {}, ...props } = stepperProps; const { ReviewStateComponent = ReviewState, createButtonText = 'Create', reviewButtonText = 'Review', } = components; - const analytics = useAnalytics(); const { steps } = useTemplateSchema(props.manifest); const apiHolder = useApiHolder(); @@ -125,9 +125,9 @@ export const Stepper = (stepperProps: StepperProps) => { ); const handleNext = async ({ - formData, + formData = {}, }: { - formData: Record; + formData?: Record; }) => { // TODO(blam): What do we do about loading states, does each field extension get a chance // to display it's own loading? Or should we grey out the entire form. @@ -152,6 +152,8 @@ export const Stepper = (stepperProps: StepperProps) => { setFormState(current => ({ ...current, ...formData })); }; + const currentStep = useTransformSchemaToProps(steps[activeStep], { layouts }); + return ( <> @@ -171,8 +173,8 @@ export const Stepper = (stepperProps: StepperProps) => { extraErrors={errors as unknown as ErrorSchema} formData={formState} formContext={{ formData: formState }} - schema={steps[activeStep].schema} - uiSchema={steps[activeStep].uiSchema} + schema={currentStep.schema} + uiSchema={currentStep.uiSchema} onSubmit={handleNext} fields={extensions} showErrorList={false} diff --git a/plugins/scaffolder-react/src/next/components/Workflow/Workflow.tsx b/plugins/scaffolder-react/src/next/components/Workflow/Workflow.tsx index cca69ab7b3..f6ff12e3a3 100644 --- a/plugins/scaffolder-react/src/next/components/Workflow/Workflow.tsx +++ b/plugins/scaffolder-react/src/next/components/Workflow/Workflow.tsx @@ -51,7 +51,12 @@ export type WorkflowProps = { onError(error: Error | undefined): JSX.Element | null; } & Pick< StepperProps, - 'extensions' | 'FormProps' | 'components' | 'onCreate' | 'initialState' + | 'extensions' + | 'FormProps' + | 'components' + | 'onCreate' + | 'initialState' + | 'layouts' >; /** diff --git a/plugins/scaffolder-react/src/next/hooks/useTransformSchemaToProps.test.tsx b/plugins/scaffolder-react/src/next/hooks/useTransformSchemaToProps.test.tsx new file mode 100644 index 0000000000..6dba7b9f29 --- /dev/null +++ b/plugins/scaffolder-react/src/next/hooks/useTransformSchemaToProps.test.tsx @@ -0,0 +1,52 @@ +/* + * 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 React from 'react'; +import { renderHook } from '@testing-library/react-hooks'; +import { TestApiProvider } from '@backstage/test-utils'; +import { type ParsedTemplateSchema } from './useTemplateSchema'; +import { useTransformSchemaToProps } from './useTransformSchemaToProps'; + +describe('useTransformSchemaToProps', () => { + it('should replace ui:ObjectFieldTemplate with actual component', () => { + const layouts = [{ name: 'TwoColumn', component: jest.fn() }]; + + const step: ParsedTemplateSchema = { + title: 'Fill in some steps', + mergedSchema: {}, + schema: {}, + uiSchema: { + 'ui:ObjectFieldTemplate': 'TwoColumn' as any, + name: { + 'ui:field': 'EntityNamePicker', + 'ui:autofocus': true, + }, + }, + }; + + const { result } = renderHook( + () => useTransformSchemaToProps(step, { layouts }), + { + wrapper: ({ children }) => ( + {children} + ), + }, + ); + + const { uiSchema } = result.current; + + expect(uiSchema['ui:ObjectFieldTemplate']).toEqual(layouts[0].component); + }); +}); diff --git a/plugins/scaffolder-react/src/next/hooks/useTransformSchemaToProps.ts b/plugins/scaffolder-react/src/next/hooks/useTransformSchemaToProps.ts new file mode 100644 index 0000000000..ffae1df8bf --- /dev/null +++ b/plugins/scaffolder-react/src/next/hooks/useTransformSchemaToProps.ts @@ -0,0 +1,51 @@ +/* + * 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 { type ParsedTemplateSchema } from './useTemplateSchema'; +import { type LayoutOptions } from '../types'; + +interface Options { + layouts?: LayoutOptions[]; +} + +export const useTransformSchemaToProps = ( + step: ParsedTemplateSchema, + options: Options = {}, +): ParsedTemplateSchema => { + const { layouts = [] } = options; + const objectFieldTemplate = step?.uiSchema['ui:ObjectFieldTemplate'] as + | string + | undefined; + + if (typeof objectFieldTemplate !== 'string') { + return step; + } + + const Layout = layouts.find( + layout => layout.name === objectFieldTemplate, + )?.component; + + if (!Layout) { + return step; + } + + return { + ...step, + uiSchema: { + ...step.uiSchema, + ['ui:ObjectFieldTemplate']: Layout, + }, + }; +}; diff --git a/plugins/scaffolder-react/src/next/index.ts b/plugins/scaffolder-react/src/next/index.ts index ea009ea556..4674c1f70a 100644 --- a/plugins/scaffolder-react/src/next/index.ts +++ b/plugins/scaffolder-react/src/next/index.ts @@ -15,6 +15,8 @@ */ export * from './components'; export * from './extensions'; -export type { FormProps } from './types'; +export * from './layouts'; +export * from './types'; export * from './lib'; export * from './hooks'; +export * from './layouts'; diff --git a/plugins/scaffolder/src/layouts/index.tsx b/plugins/scaffolder-react/src/next/layouts/index.tsx similarity index 80% rename from plugins/scaffolder/src/layouts/index.tsx rename to plugins/scaffolder-react/src/next/layouts/index.tsx index ce1dac9bdf..0b1533c7c8 100644 --- a/plugins/scaffolder/src/layouts/index.tsx +++ b/plugins/scaffolder-react/src/next/layouts/index.tsx @@ -1,5 +1,8 @@ +import { LayoutOptions } from '../types'; +import { LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from './keys'; + /* - * Copyright 2022 The Backstage Authors + * 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. @@ -13,16 +16,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import { attachComponentData, Extension } from '@backstage/core-plugin-api'; -import type { LayoutOptions } from './types'; - -export const LAYOUTS_KEY = 'scaffolder.layout.v1'; -export const LAYOUTS_WRAPPER_KEY = 'scaffolder.layouts.wrapper.v1'; /** - * The type used to wrap up the Layout and embed the input props - * + * A type used to wrap up the FieldExtension to embed the ReturnValue and the InputProps * @public */ export type LayoutComponent<_TInputProps> = () => null; @@ -55,5 +52,3 @@ export const ScaffolderLayouts: React.ComponentType = (): JSX.Element | null => null; attachComponentData(ScaffolderLayouts, LAYOUTS_WRAPPER_KEY, true); - -export type { LayoutOptions, LayoutTemplate } from './types'; diff --git a/plugins/scaffolder-react/src/next/layouts/keys.ts b/plugins/scaffolder-react/src/next/layouts/keys.ts new file mode 100644 index 0000000000..a82b1597f4 --- /dev/null +++ b/plugins/scaffolder-react/src/next/layouts/keys.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ +export const LAYOUTS_KEY = 'scaffolder.layout.v1'; +export const LAYOUTS_WRAPPER_KEY = 'scaffolder.layouts.wrapper.v1'; diff --git a/plugins/scaffolder-react/src/next/types.ts b/plugins/scaffolder-react/src/next/types.ts index 32d0fe85f0..40ba511dbe 100644 --- a/plugins/scaffolder-react/src/next/types.ts +++ b/plugins/scaffolder-react/src/next/types.ts @@ -14,13 +14,31 @@ * limitations under the License. */ import type { FormProps as SchemaFormProps } from '@rjsf/core-v5'; - /** * Any `@rjsf/core` form properties that are publicly exposed to the `NextScaffolderpage` * - * @alpha + * @public */ export type FormProps = Pick< SchemaFormProps, 'transformErrors' | 'noHtml5Validate' >; + +/** + * The field template from `@rjsf/core` which is a react component that gets passed `@rjsf/core` field related props. + * + * @public + */ +export type LayoutTemplate = NonNullable< + SchemaFormProps['uiSchema'] +>['ui:ObjectFieldTemplate']; + +/** + * The type of layouts that is passed to the TemplateForms + * + * @public + */ +export interface LayoutOptions

{ + name: string; + component: LayoutTemplate

; +} diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 0d25838d22..d343d4e224 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-scaffolder +## 1.11.0-next.0 + +### Minor Changes + +- d6bb12a2e7: - **Deprecation** - Deprecated the following exports, please import them directly from `@backstage/plugin-scaffolder-react` instead + + ``` + createScaffolderLayout + ScaffolderLayouts + LayoutOptions + LayoutTemplate + ``` + +- 8c2966536b: Embed scaffolder workflow in other components + +### Patch Changes + +- cbab8ac107: lock versions of `@rjsf/*-beta` packages +- d2ddde2108: Add `ScaffolderLayouts` to `NextScaffolderPage` +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-scaffolder-common@1.2.5-next.0 + - @backstage/integration-react@1.1.9 + ## 1.10.0 ### Minor Changes diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 82a8dfd8d3..1fb72b0fac 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -10,21 +10,23 @@ import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { ComponentType } from 'react'; import { createScaffolderFieldExtension as createScaffolderFieldExtension_2 } from '@backstage/plugin-scaffolder-react'; +import { createScaffolderLayout as createScaffolderLayout_2 } from '@backstage/plugin-scaffolder-react'; import { CustomFieldExtensionSchema as CustomFieldExtensionSchema_2 } from '@backstage/plugin-scaffolder-react'; import { CustomFieldValidator as CustomFieldValidator_2 } from '@backstage/plugin-scaffolder-react'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { Entity } from '@backstage/catalog-model'; -import { Extension } from '@backstage/core-plugin-api'; import { ExternalRouteRef } from '@backstage/core-plugin-api'; import { FetchApi } from '@backstage/core-plugin-api'; import { FieldExtensionComponent as FieldExtensionComponent_2 } from '@backstage/plugin-scaffolder-react'; import { FieldExtensionComponentProps as FieldExtensionComponentProps_2 } from '@backstage/plugin-scaffolder-react'; import { FieldExtensionOptions as FieldExtensionOptions_2 } from '@backstage/plugin-scaffolder-react'; import { FieldValidation } from '@rjsf/core'; -import type { FormProps as FormProps_2 } from '@rjsf/core'; +import { FormProps as FormProps_2 } from '@backstage/plugin-scaffolder-react'; import type { FormProps as FormProps_3 } from '@rjsf/core-v5'; import { IdentityApi } from '@backstage/core-plugin-api'; import { JsonObject } from '@backstage/types'; +import { LayoutOptions as LayoutOptions_2 } from '@backstage/plugin-scaffolder-react'; +import { LayoutTemplate as LayoutTemplate_2 } from '@backstage/plugin-scaffolder-react'; import { ListActionsResponse as ListActionsResponse_2 } from '@backstage/plugin-scaffolder-react'; import { LogEvent as LogEvent_2 } from '@backstage/plugin-scaffolder-react'; import { Observable } from '@backstage/types'; @@ -56,10 +58,8 @@ import { z } from 'zod'; // @public @deprecated (undocumented) export const createScaffolderFieldExtension: typeof createScaffolderFieldExtension_2; -// @public -export function createScaffolderLayout( - options: LayoutOptions, -): Extension>; +// @public @deprecated (undocumented) +export const createScaffolderLayout: typeof createScaffolderLayout_2; // @public @deprecated (undocumented) export type CustomFieldExtensionSchema = CustomFieldExtensionSchema_2; @@ -161,19 +161,11 @@ export type FormProps = Pick< 'transformErrors' | 'noHtml5Validate' >; -// @public -export type LayoutComponent<_TInputProps> = () => null; +// @public @deprecated (undocumented) +export type LayoutOptions = LayoutOptions_2; -// @public -export interface LayoutOptions

{ - // (undocumented) - component: LayoutTemplate

; - // (undocumented) - name: string; -} - -// @public -export type LayoutTemplate = FormProps_2['ObjectFieldTemplate']; +// @public @deprecated (undocumented) +export type LayoutTemplate = LayoutTemplate_2; // @public @deprecated (undocumented) export type ListActionsResponse = ListActionsResponse_2; @@ -207,7 +199,7 @@ export type NextRouterProps = { TaskPageComponent?: React_2.ComponentType<{}>; }; groups?: TemplateGroupFilter[]; - FormProps?: FormProps; + FormProps?: FormProps_2; }; // @alpha @@ -453,8 +445,8 @@ export type ScaffolderGetIntegrationsListOptions = export type ScaffolderGetIntegrationsListResponse = ScaffolderGetIntegrationsListResponse_2; -// @public -export const ScaffolderLayouts: React.ComponentType; +// @public @deprecated (undocumented) +export const ScaffolderLayouts: ComponentType<{}>; // @public @deprecated (undocumented) export type ScaffolderOutputlink = ScaffolderOutputLink; diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 97ee629cfa..1967349922 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder", "description": "The Backstage plugin that helps you create new things", - "version": "1.10.0", + "version": "1.11.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -56,9 +56,8 @@ "@material-ui/lab": "4.0.0-alpha.57", "@react-hookz/web": "^20.0.0", "@rjsf/core": "^3.2.1", - "@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.16", "@rjsf/material-ui": "^3.2.1", - "@rjsf/utils": "5.0.0-beta.16", + "@rjsf/utils": "5.0.0-beta.18", "@uiw/react-codemirror": "^4.9.3", "classnames": "^2.2.6", "git-url-parse": "^13.0.0", diff --git a/plugins/scaffolder/src/components/MultistepJsonForm/MultistepJsonForm.tsx b/plugins/scaffolder/src/components/MultistepJsonForm/MultistepJsonForm.tsx index 3a1196bc0e..a74b65b885 100644 --- a/plugins/scaffolder/src/components/MultistepJsonForm/MultistepJsonForm.tsx +++ b/plugins/scaffolder/src/components/MultistepJsonForm/MultistepJsonForm.tsx @@ -35,10 +35,12 @@ import React, { ComponentType, useState } from 'react'; import { transformSchemaToProps } from './schema'; import cloneDeep from 'lodash/cloneDeep'; import * as fieldOverrides from './FieldOverrides'; -import { LayoutOptions } from '../../layouts'; import { ReviewStepProps } from '../types'; import { ReviewStep } from './ReviewStep'; -import { extractSchemaFromStep } from '@backstage/plugin-scaffolder-react'; +import { + extractSchemaFromStep, + type LayoutOptions, +} from '@backstage/plugin-scaffolder-react'; import { selectedTemplateRouteRef } from '../../routes'; const Form = withTheme(MuiTheme); diff --git a/plugins/scaffolder/src/components/MultistepJsonForm/schema.ts b/plugins/scaffolder/src/components/MultistepJsonForm/schema.ts index 5d74b0fc81..c3c90ae86a 100644 --- a/plugins/scaffolder/src/components/MultistepJsonForm/schema.ts +++ b/plugins/scaffolder/src/components/MultistepJsonForm/schema.ts @@ -16,7 +16,7 @@ import { JsonObject } from '@backstage/types'; import { FormProps, UiSchema } from '@rjsf/core'; -import { LayoutOptions } from '../../layouts'; +import type { LayoutOptions } from '@backstage/plugin-scaffolder-react'; function isObject(value: unknown): value is JsonObject { return typeof value === 'object' && value !== null && !Array.isArray(value); @@ -120,7 +120,8 @@ export function transformSchemaToProps( )?.component; if (Layout) { - uiSchema['ui:ObjectFieldTemplate'] = Layout; + uiSchema['ui:ObjectFieldTemplate'] = + Layout as unknown as FormProps['ObjectFieldTemplate']; } } diff --git a/plugins/scaffolder/src/components/Router.tsx b/plugins/scaffolder/src/components/Router.tsx index 6a2da406e0..ccc2bd283b 100644 --- a/plugins/scaffolder/src/components/Router.tsx +++ b/plugins/scaffolder/src/components/Router.tsx @@ -24,18 +24,14 @@ import { TaskPage } from './TaskPage'; import { ActionsPage } from './ActionsPage'; import { TemplateEditorPage } from './TemplateEditorPage'; import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../extensions/default'; -import { - useElementFilter, - useRouteRef, - useRouteRefParams, -} from '@backstage/core-plugin-api'; +import { useRouteRef, useRouteRefParams } from '@backstage/core-plugin-api'; import { FieldExtensionOptions, SecretsContextProvider, useCustomFieldExtensions, + useCustomLayouts, } from '@backstage/plugin-scaffolder-react'; import { ListTasksPage } from './ListTasksPage'; -import { LayoutOptions, LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from '../layouts'; import { ReviewStepProps } from './types'; import { actionsRouteRef, @@ -104,16 +100,7 @@ export const Router = (props: RouterProps) => { ), ] as FieldExtensionOptions[]; - // todo(blam): this should also be moved to a hook in -react - const customLayouts = useElementFilter(outlet, elements => - elements - .selectByComponentData({ - key: LAYOUTS_WRAPPER_KEY, - }) - .findComponentData({ - key: LAYOUTS_KEY, - }), - ); + const customLayouts = useCustomLayouts(outlet); /** * This component can be deleted once the older routes have been deprecated. diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor.tsx index dc67f687bb..e07434aff7 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor.tsx @@ -15,8 +15,10 @@ */ import { makeStyles } from '@material-ui/core'; import React, { useState } from 'react'; -import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; -import type { LayoutOptions } from '../../layouts'; +import type { + FieldExtensionOptions, + LayoutOptions, +} from '@backstage/plugin-scaffolder-react'; import { TemplateDirectoryAccess } from '../../lib/filesystem'; import { DirectoryEditorProvider } from './DirectoryEditorContext'; import { DryRunProvider } from './DryRunContext'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx index c62112a89c..315028219b 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx @@ -19,11 +19,11 @@ import { makeStyles } from '@material-ui/core/styles'; import React, { Component, ReactNode, useMemo, useState } from 'react'; import useDebounce from 'react-use/lib/useDebounce'; import yaml from 'yaml'; -import { +import type { FieldExtensionOptions, + LayoutOptions, TemplateParameterSchema, } from '@backstage/plugin-scaffolder-react'; -import { LayoutOptions } from '../../layouts'; import { MultistepJsonForm } from '../MultistepJsonForm'; import { createValidator } from '../TemplatePage'; import { useDirectoryEditor } from './DirectoryEditorContext'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx index 20691a8e85..ebb763e145 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx @@ -23,8 +23,10 @@ import { CustomFieldExplorer } from './CustomFieldExplorer'; import { TemplateEditorIntro } from './TemplateEditorIntro'; import { TemplateEditor } from './TemplateEditor'; import { TemplateFormPreviewer } from './TemplateFormPreviewer'; -import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; -import type { LayoutOptions } from '../../layouts'; +import { + type FieldExtensionOptions, + type LayoutOptions, +} from '@backstage/plugin-scaffolder-react'; type Selection = | { diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateFormPreviewer.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateFormPreviewer.tsx index 884305bf64..a7e3c6a697 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateFormPreviewer.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateFormPreviewer.tsx @@ -32,8 +32,10 @@ import CloseIcon from '@material-ui/icons/Close'; import React, { useCallback, useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; import yaml from 'yaml'; -import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; -import { LayoutOptions } from '../../layouts'; +import { + type FieldExtensionOptions, + type LayoutOptions, +} from '@backstage/plugin-scaffolder-react'; import { TemplateEditorForm } from './TemplateEditorForm'; import { TemplateEditorTextArea } from './TemplateEditorTextArea'; diff --git a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx index 0f484ff404..c615649f93 100644 --- a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx +++ b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx @@ -20,7 +20,8 @@ import React, { ComponentType, useCallback, useState } from 'react'; import { Navigate, useNavigate } from 'react-router-dom'; import useAsync from 'react-use/lib/useAsync'; import { - FieldExtensionOptions, + type FieldExtensionOptions, + type LayoutOptions, scaffolderApiRef, useTemplateSecrets, } from '@backstage/plugin-scaffolder-react'; @@ -37,7 +38,6 @@ import { useRouteRefParams, } from '@backstage/core-plugin-api'; import { stringifyEntityRef } from '@backstage/catalog-model'; -import { LayoutOptions } from '../../layouts'; import { ReviewStepProps } from '../types'; import { rootRouteRef, diff --git a/plugins/scaffolder/src/deprecated.ts b/plugins/scaffolder/src/deprecated.ts index 201f7ac7d7..f08a83c594 100644 --- a/plugins/scaffolder/src/deprecated.ts +++ b/plugins/scaffolder/src/deprecated.ts @@ -25,6 +25,10 @@ import { ScaffolderFieldExtensions as ScaffolderFieldExtensionsTemp, useTemplateSecrets as useTemplateSecretsTemp, scaffolderApiRef as scaffolderApiRefTemp, + createScaffolderLayout as createScaffolderLayoutTemp, + ScaffolderLayouts as ScaffolderLayoutsTemp, + type LayoutOptions as LayoutOptionsTemp, + type LayoutTemplate as LayoutTemplateTemp, type ScaffolderApi as ScaffolderApiTemp, type ScaffolderUseTemplateSecrets as ScaffolderUseTemplateSecretsTemp, type TemplateParameterSchema as TemplateParameterSchemaTemp, @@ -188,3 +192,23 @@ export type ScaffolderTaskOutput = ScaffolderTaskOutputTemp; * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderTaskStatus} instead as this has now been moved. */ export type ScaffolderTaskStatus = ScaffolderTaskStatusTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#createScaffolderLayout} instead as this has now been moved. + */ +export const createScaffolderLayout = createScaffolderLayoutTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#ScaffolderLayouts} instead as this has now been moved. + */ +export const ScaffolderLayouts = ScaffolderLayoutsTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#LayoutTemplate} instead as this has now been moved. + */ +export type LayoutTemplate = LayoutTemplateTemp; +/** + * @public + * @deprecated use import from {@link @backstage/plugin-scaffolder-react#LayoutOptions} instead as this has now been moved. + */ +export type LayoutOptions = LayoutOptionsTemp; diff --git a/plugins/scaffolder/src/index.ts b/plugins/scaffolder/src/index.ts index 0e2b293982..aa78874f9d 100644 --- a/plugins/scaffolder/src/index.ts +++ b/plugins/scaffolder/src/index.ts @@ -21,14 +21,6 @@ */ export { ScaffolderClient } from './api'; -export { - createScaffolderLayout, - ScaffolderLayouts, - type LayoutOptions, - type LayoutTemplate, - type LayoutComponent, -} from './layouts'; - export { EntityPickerFieldExtension, EntityNamePickerFieldExtension, diff --git a/plugins/scaffolder/src/next/Router/Router.test.tsx b/plugins/scaffolder/src/next/Router/Router.test.tsx index 4e5535be6c..9565572a2f 100644 --- a/plugins/scaffolder/src/next/Router/Router.test.tsx +++ b/plugins/scaffolder/src/next/Router/Router.test.tsx @@ -23,6 +23,10 @@ import { ScaffolderFieldExtensions, } from '@backstage/plugin-scaffolder-react'; import { scaffolderPlugin } from '../../plugin'; +import { + createScaffolderLayout, + ScaffolderLayouts, +} from '@backstage/plugin-scaffolder-react'; jest.mock('../TemplateListPage', () => ({ TemplateListPage: jest.fn(() => null), @@ -106,5 +110,36 @@ describe('Router', () => { ]), ); }); + + it('should extract the layouts and pass them through', async () => { + const mockLayoutComponent = () => null; + const Layout = scaffolderPlugin.provide( + createScaffolderLayout({ + name: 'layout', + component: mockLayoutComponent, + }), + ); + + await renderInTestApp( + + + + + , + { routeEntries: ['/templates/default/foo'] }, + ); + + const mock = TemplateWizardPage as jest.Mock; + const [{ layouts }] = mock.mock.calls[0]; + + expect(layouts).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + name: 'layout', + component: mockLayoutComponent, + }), + ]), + ); + }); }); }); diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index f91e56bba7..8dd47b478e 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -21,12 +21,13 @@ import { NextFieldExtensionOptions, SecretsContextProvider, useCustomFieldExtensions, + useCustomLayouts, + type FormProps, } from '@backstage/plugin-scaffolder-react'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateGroupFilter } from '../TemplateListPage/TemplateGroups'; import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default'; -import { type FormProps } from '../types'; import { nextSelectedTemplateRouteRef } from '../routes'; /** @@ -65,6 +66,8 @@ export const Router = (props: PropsWithChildren) => { ), ] as NextFieldExtensionOptions[]; + const customLayouts = useCustomLayouts(outlet); + return ( ) => { diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx index 24c529b094..d24482a583 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx +++ b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx @@ -25,17 +25,19 @@ import { import { scaffolderApiRef, useTemplateSecrets, - NextFieldExtensionOptions, + Workflow, + type LayoutOptions, } from '@backstage/plugin-scaffolder-react'; +import { NextFieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import { JsonValue } from '@backstage/types'; import { type FormProps } from '../types'; import { nextRouteRef } from '../routes'; import { scaffolderTaskRouteRef, selectedTemplateRouteRef } from '../../routes'; import { Header, Page } from '@backstage/core-components'; -import { Workflow } from '@backstage/plugin-scaffolder-react'; -type TemplateWizardPageProps = { +export type TemplateWizardPageProps = { customFieldExtensions: NextFieldExtensionOptions[]; + layouts?: LayoutOptions[]; FormProps?: FormProps; }; @@ -82,6 +84,7 @@ export const TemplateWizardPage = (props: TemplateWizardPageProps) => { onError={onError} extensions={props.customFieldExtensions} FormProps={props.FormProps} + layouts={props.layouts} /> diff --git a/plugins/scaffolder/src/next/types.ts b/plugins/scaffolder/src/next/types.ts index e9c77aa00e..c2ee473d54 100644 --- a/plugins/scaffolder/src/next/types.ts +++ b/plugins/scaffolder/src/next/types.ts @@ -23,7 +23,7 @@ import type { FormProps as SchemaFormProps } from '@rjsf/core-v5'; /** - * Any `@rjsf/core` form properties that are publicly exposed to the `NextScaffolderpage` + * Any `@rjsf/core` form properties that are publicly exposed to the `NextScaffolderPage` * * @alpha * @deprecated use the import from {@link @backstage/plugin-scaffolder-react/alpha#FormProps} instead diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index 5d4249e882..5b3f82a37b 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@1.1.3-next.0 + ## 1.1.1 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index dc3766116a..856f9b5e55 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", "description": "A module for the search backend that implements search using ElasticSearch", - "version": "1.1.1", + "version": "1.1.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index 7f6888ac53..09082b4cd3 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-search-backend-node@1.1.3-next.0 + ## 0.5.1 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index acc0d6fa01..832a5528f9 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-pg", "description": "A module for the search backend that implements search using PostgreSQL", - "version": "0.5.1", + "version": "0.5.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index a56f7aa349..57ec19a2c4 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-search-backend-node +## 1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + ## 1.1.1 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index e82319fdb6..18496a1c39 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-node", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", - "version": "1.1.1", + "version": "1.1.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index fecb4cb9ea..0dcdec3ed5 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend +## 1.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/plugin-permission-node@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.1.3-next.0 + ## 1.2.1 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 54b374011f..72cfadf821 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend", "description": "The Backstage backend plugin that provides your backstage app with search", - "version": "1.2.1", + "version": "1.2.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index ea24b77523..32eebe7fae 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-search +## 1.0.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 1.0.7 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 21b6631504..7aa8b5a123 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search", "description": "The Backstage plugin that provides your backstage app with search", - "version": "1.0.7", + "version": "1.0.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md index 9a232f5be1..49be1fc880 100644 --- a/plugins/sentry/CHANGELOG.md +++ b/plugins/sentry/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-sentry +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.4.7 ### Patch Changes diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index 14a9f1bd1c..72e9fbdc50 100644 --- a/plugins/sentry/package.json +++ b/plugins/sentry/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sentry", "description": "A Backstage plugin that integrates towards Sentry", - "version": "0.4.7", + "version": "0.4.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md index 57a32877e6..0475073584 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-sonarqube-backend +## 0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + ## 0.1.5 ### Patch Changes diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index 4f1e560bd0..5aa8367434 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-backend", - "version": "0.1.5", + "version": "0.1.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-react/CHANGELOG.md b/plugins/sonarqube-react/CHANGELOG.md index 5368c648dc..41b5d5b371 100644 --- a/plugins/sonarqube-react/CHANGELOG.md +++ b/plugins/sonarqube-react/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-sonarqube-react +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/sonarqube-react/package.json b/plugins/sonarqube-react/package.json index 9332cc5548..ebf75572ec 100644 --- a/plugins/sonarqube-react/package.json +++ b/plugins/sonarqube-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-react", - "version": "0.1.1", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index e2e76c2b89..0d71fd4f9a 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-sonarqube +## 0.6.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-sonarqube-react@0.1.2-next.0 + ## 0.6.2 ### Patch Changes diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index af04494906..80b8622fc1 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.6.2", + "version": "0.6.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md index 05e2fa7794..e92f250fad 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-splunk-on-call +## 0.4.4-next.0 + +### Patch Changes + +- 3598136ac7: Refactor plugin Card component to not rerender contents unnecessarily. +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.4.3 ### Patch Changes diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index 3b8aebcd71..8e2b7f278c 100644 --- a/plugins/splunk-on-call/package.json +++ b/plugins/splunk-on-call/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-splunk-on-call", "description": "A Backstage plugin that integrates towards Splunk On-Call", - "version": "0.4.3", + "version": "0.4.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/splunk-on-call/src/components/EntitySplunkOnCallCard.tsx b/plugins/splunk-on-call/src/components/EntitySplunkOnCallCard.tsx index 26521ea9ee..54784b1f4e 100644 --- a/plugins/splunk-on-call/src/components/EntitySplunkOnCallCard.tsx +++ b/plugins/splunk-on-call/src/components/EntitySplunkOnCallCard.tsx @@ -33,7 +33,7 @@ import { MissingApiKeyOrApiIdError } from './Errors'; import { EscalationPolicy } from './Escalation'; import { Incidents } from './Incident'; import { TriggerDialog } from './TriggerDialog'; -import { RoutingKey, Team, User } from './types'; +import { RoutingKey, User } from './types'; import { configApiRef, useApi } from '@backstage/core-plugin-api'; import { @@ -219,37 +219,6 @@ export const EntitySplunkOnCallCard = (props: EntitySplunkOnCallCardProps) => { ); } - const Content = ({ - team, - routingKey, - usersHashMap, - }: { - team: Team | undefined; - routingKey: RoutingKey | undefined; - usersHashMap: any; - }) => { - const teamName = team?.name ?? ''; - - return ( - <> - - {usersHashMap && team && ( - - )} - - - ); - }; - const triggerLink: IconLinkVerticalProps = { label: 'Create Incident', onClick: handleDialog, @@ -267,30 +236,45 @@ export const EntitySplunkOnCallCard = (props: EntitySplunkOnCallCardProps) => { return ( <> - {teams.map((team, i) => ( - - - Team: {team && team.name ? team.name : ''} - , - , - ]} - /> - - - { + const teamName = team?.name ?? ''; + return ( + + + Team: {team && team.name ? team.name : ''} + , + , + ]} /> - - - ))} + + + + {entityData?.usersHashMap && team && ( + + )} + + + + ); + })} ); }; diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md index a29993ea05..7a2535eae5 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-stack-overflow-backend +## 0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + ## 0.1.9 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index 857ea48fba..4d5009bee1 100644 --- a/plugins/stack-overflow-backend/package.json +++ b/plugins/stack-overflow-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow-backend", - "version": "0.1.9", + "version": "0.1.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md index a6af55488a..e9ad1d9958 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-stack-overflow +## 0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.4.31-next.0 + ## 0.1.10 ### Patch Changes diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 3d0ddc0d0c..62a15a30c1 100644 --- a/plugins/stack-overflow/package.json +++ b/plugins/stack-overflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow", - "version": "0.1.10", + "version": "0.1.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index 91b5a6ea8e..96e65d116b 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.26-next.0 + +### Patch Changes + +- d6b912f963: Surface the cause of the json rules engine +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-tech-insights-node@0.3.10-next.0 + ## 0.1.24 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index b2ec55e821..1a6d87ec6f 100644 --- a/plugins/tech-insights-backend-module-jsonfc/package.json +++ b/plugins/tech-insights-backend-module-jsonfc/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend-module-jsonfc", - "version": "0.1.24", + "version": "0.1.26-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index 97031a15d7..89753667a1 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-tech-insights-backend +## 0.5.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + - @backstage/plugin-tech-insights-node@0.3.10-next.0 + ## 0.5.6 ### Patch Changes diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index 06fab9fde1..edb94c5784 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend", - "version": "0.5.6", + "version": "0.5.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index d0b78e9fac..d7986767ae 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-tech-insights-node +## 0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + ## 0.3.8 ### Patch Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index a0c9786504..2981b652a5 100644 --- a/plugins/tech-insights-node/package.json +++ b/plugins/tech-insights-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-node", - "version": "0.3.8", + "version": "0.3.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md index f26f9f910e..247c9605f4 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-tech-insights +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.3.6 ### Patch Changes diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index 221445f1be..fe815a044d 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights", - "version": "0.3.6", + "version": "0.3.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 8fdcfa1715..a27d587f36 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.4.4-next.0 + - @backstage/plugin-catalog@1.7.3-next.0 + - @backstage/plugin-techdocs-react@1.1.3-next.0 + - @backstage/integration-react@1.1.9 + ## 1.0.9 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 78dfd8a17f..baff541f54 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.9", + "version": "1.0.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index a2e5f4d02b..f669d1924b 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-techdocs-backend +## 1.5.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.4.6-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + ## 1.5.1 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 9760707736..396aba2fca 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-backend", "description": "The Backstage backend plugin that renders technical documentation for your components", - "version": "1.5.1", + "version": "1.5.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 1608822d2b..0f0c2999bd 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.1.3-next.0 + - @backstage/integration-react@1.1.9 + ## 1.0.9 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 984cd02238..ae5d263268 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", "description": "Plugin module for contributed TechDocs Addons", - "version": "1.0.9", + "version": "1.0.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 45e5659988..7aca6e0041 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-techdocs-node +## 1.4.6-next.0 + +### Patch Changes + +- 87ab76e55c: Fixed bug caused by recent migration to AWS SDK V3 for techdocs-node. Instead of s3ForcePathStyle, forcePathStyle should be passed. +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + ## 1.4.4 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 47a9eda22b..fa2587953c 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-node", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", - "version": "1.4.4", + "version": "1.4.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index d70252571f..4f9744158d 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-techdocs-react +## 1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + ## 1.1.2 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 2f3aefce74..781ba74c94 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-react", "description": "Shared frontend utilities for TechDocs and Addons", - "version": "1.1.2", + "version": "1.1.3-next.0", "publishConfig": { "access": "public", "alphaTypes": "dist/index.alpha.d.ts", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index ad6e76c540..22d52c02e8 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-techdocs +## 1.4.4-next.0 + +### Patch Changes + +- c8e09cc383: Fixed bug in Techdocs reader where a techdocs page with a hash in the URL did not always jump to the document anchor. +- cad5607411: Improve view: remove footer overlay on large screen +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-techdocs-react@1.1.3-next.0 + - @backstage/integration-react@1.1.9 + ## 1.4.3 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 33c5ec8852..d04115188b 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs", "description": "The Backstage plugin that renders technical documentation for your components", - "version": "1.4.3", + "version": "1.4.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts b/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts index c4e6938fdc..e6bad41045 100644 --- a/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts +++ b/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts @@ -105,7 +105,13 @@ export default ({ theme, sidebar }: RuleOptions) => ` .md-footer { position: fixed; bottom: 0px; + pointer-events: none; } + +.md-footer-nav__link { + pointer-events: all; +} + .md-footer__title { background-color: unset; } diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index 566dadaf2e..ae9ec851f0 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-todo-backend +## 0.1.39-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/catalog-client@1.3.1-next.0 + ## 0.1.37 ### Patch Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index 9f0d58bc86..3fbc52bb70 100644 --- a/plugins/todo-backend/package.json +++ b/plugins/todo-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo-backend", "description": "A Backstage backend plugin that lets you browse TODO comments in your source code", - "version": "0.1.37", + "version": "0.1.39-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo/CHANGELOG.md b/plugins/todo/CHANGELOG.md index 1788011fcb..fa5fb5064b 100644 --- a/plugins/todo/CHANGELOG.md +++ b/plugins/todo/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-todo +## 0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.2.16 ### Patch Changes diff --git a/plugins/todo/package.json b/plugins/todo/package.json index a1868ebe92..00ea5873d6 100644 --- a/plugins/todo/package.json +++ b/plugins/todo/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo", "description": "A Backstage plugin that lets you browse TODO comments in your source code", - "version": "0.2.16", + "version": "0.2.17-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 1eb35b3ba5..90069ca40c 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-user-settings-backend +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + ## 0.1.4 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index b64b30f19d..f69f13bcee 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings-backend", "description": "The Backstage backend plugin to manage user settings", - "version": "0.1.4", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index 7d156138db..aa64c91086 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-user-settings +## 0.6.3-next.0 + +### Patch Changes + +- c4940b6322: Added a message to advise a page reload when toggling feature flags +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + ## 0.6.2 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 16c120fb35..64f1cdd8d3 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings", "description": "A Backstage plugin that provides a settings page", - "version": "0.6.2", + "version": "0.6.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx index a3b5f593ae..c58e637bd2 100644 --- a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx +++ b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx @@ -82,6 +82,9 @@ export const UserSettingsFeatureFlags = () => { Feature Flags + + Please refresh the page when toggling feature flags + {featureFlags.length >= 10 && ( diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index 1d7090b880..e81269ec17 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-vault-backend +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.34-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/backend-tasks@0.4.3-next.0 + ## 0.2.6 ### Patch Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index 7d331a79ab..507c2c5713 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-backend", "description": "A Backstage backend plugin that integrates towards Vault", - "version": "0.2.6", + "version": "0.2.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md index b322ea9763..5ea984e2ef 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-vault +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/catalog-model@1.1.6-next.0 + ## 0.1.8 ### Patch Changes diff --git a/plugins/vault/package.json b/plugins/vault/package.json index ecece0283e..26376c18d5 100644 --- a/plugins/vault/package.json +++ b/plugins/vault/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault", "description": "A Backstage plugin that integrates towards Vault", - "version": "0.1.8", + "version": "0.1.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/storybook/yarn.lock b/storybook/yarn.lock index 7820ea2d4e..c1ece03aac 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -2966,90 +2966,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-darwin-arm64@npm:1.3.27" +"@swc/core-darwin-arm64@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-darwin-arm64@npm:1.3.28" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-darwin-x64@npm:1.3.27" +"@swc/core-darwin-x64@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-darwin-x64@npm:1.3.28" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.27" +"@swc/core-linux-arm-gnueabihf@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.28" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.27" +"@swc/core-linux-arm64-gnu@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.28" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.27" +"@swc/core-linux-arm64-musl@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.28" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.27" +"@swc/core-linux-x64-gnu@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.28" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-linux-x64-musl@npm:1.3.27" +"@swc/core-linux-x64-musl@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-linux-x64-musl@npm:1.3.28" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.27" +"@swc/core-win32-arm64-msvc@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.28" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.27" +"@swc/core-win32-ia32-msvc@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.28" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.27" +"@swc/core-win32-x64-msvc@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.28" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.27 - resolution: "@swc/core@npm:1.3.27" + version: 1.3.28 + resolution: "@swc/core@npm:1.3.28" dependencies: - "@swc/core-darwin-arm64": 1.3.27 - "@swc/core-darwin-x64": 1.3.27 - "@swc/core-linux-arm-gnueabihf": 1.3.27 - "@swc/core-linux-arm64-gnu": 1.3.27 - "@swc/core-linux-arm64-musl": 1.3.27 - "@swc/core-linux-x64-gnu": 1.3.27 - "@swc/core-linux-x64-musl": 1.3.27 - "@swc/core-win32-arm64-msvc": 1.3.27 - "@swc/core-win32-ia32-msvc": 1.3.27 - "@swc/core-win32-x64-msvc": 1.3.27 + "@swc/core-darwin-arm64": 1.3.28 + "@swc/core-darwin-x64": 1.3.28 + "@swc/core-linux-arm-gnueabihf": 1.3.28 + "@swc/core-linux-arm64-gnu": 1.3.28 + "@swc/core-linux-arm64-musl": 1.3.28 + "@swc/core-linux-x64-gnu": 1.3.28 + "@swc/core-linux-x64-musl": 1.3.28 + "@swc/core-win32-arm64-msvc": 1.3.28 + "@swc/core-win32-ia32-msvc": 1.3.28 + "@swc/core-win32-x64-msvc": 1.3.28 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -3071,7 +3071,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: 1e43612e65bd223e32db59497ea0bd1345a6da6ae1c4bb42556f1948da1175035c92b7a2b4dda76bfd4f7b229e885756cd9ec36af876e4e3da3f48cb4ba2fa0d + checksum: bc96bb6cf476bf815d2f9308b280c119f8c8ecc4e9ba459322415d884c21dcad040ae8c69646811e598e0039ab497c8f15031c331fd6d13ea5bdf848b9c9f44f languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index 9fdb0bd4e0..ede8ab22a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,14 +22,14 @@ __metadata: linkType: hard "@apidevtools/json-schema-ref-parser@npm:^9.0.6": - version: 9.1.0 - resolution: "@apidevtools/json-schema-ref-parser@npm:9.1.0" + version: 9.1.1 + resolution: "@apidevtools/json-schema-ref-parser@npm:9.1.1" dependencies: "@jsdevtools/ono": ^7.1.3 "@types/json-schema": ^7.0.6 call-me-maybe: ^1.0.1 js-yaml: ^4.1.0 - checksum: 135569d905cd5cd3652fe850ff3a07bfbbfb1585bb20139710e8a865f0bd9fa1c8bbe8122cce11928ce00fc618b8b9f61ccd7b62827654c9b7e2853789ee0e4a + checksum: f8fb98fec4d510ef7a135256745b7321fbc1547a83cdeb458b143d46f3d5fae1450673a9f485f77051391d052e6ec9d6ec6c0d3091d7dfe4b6ac5d85ee77e10d languageName: node linkType: hard @@ -3443,7 +3443,7 @@ __metadata: "@google-cloud/storage": ^6.0.0 "@keyv/memcache": ^1.3.5 "@keyv/redis": ^2.5.3 - "@kubernetes/client-node": 0.18.0 + "@kubernetes/client-node": 0.18.1 "@manypkg/get-packages": ^1.1.3 "@octokit/rest": ^19.0.3 "@types/archiver": ^5.1.0 @@ -3590,6 +3590,17 @@ __metadata: languageName: unknown linkType: soft +"@backstage/catalog-client@npm:^1.3.0": + version: 1.3.0 + resolution: "@backstage/catalog-client@npm:1.3.0" + dependencies: + "@backstage/catalog-model": ^1.1.5 + "@backstage/errors": ^1.1.4 + cross-fetch: ^3.1.5 + checksum: 7062e9796b5b26cc1b39690af47eacfef90f61241b1f6e775687671e15aaf9b5d3357e670e59b7ca0786fe1b08a3e76d0a00cbfd7328de79acef0f8970659021 + languageName: node + linkType: hard + "@backstage/catalog-client@workspace:^, @backstage/catalog-client@workspace:packages/catalog-client": version: 0.0.0-use.local resolution: "@backstage/catalog-client@workspace:packages/catalog-client" @@ -3602,7 +3613,22 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@^1.1.3, @backstage/catalog-model@^1.1.4, @backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": +"@backstage/catalog-model@npm:^1.1.3, @backstage/catalog-model@npm:^1.1.4, @backstage/catalog-model@npm:^1.1.5": + version: 1.1.5 + resolution: "@backstage/catalog-model@npm:1.1.5" + dependencies: + "@backstage/config": ^1.0.6 + "@backstage/errors": ^1.1.4 + "@backstage/types": ^1.0.2 + ajv: ^8.10.0 + json-schema: ^0.4.0 + lodash: ^4.17.21 + uuid: ^8.0.0 + checksum: 4a3418994047b616ae154202ef062b7b76bcbc00665998269a0f2242cb7b84e4200e3c3c3df57e10448479c70139ba09484795571f489edf1dd98ade85cc039a + languageName: node + linkType: hard + +"@backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": version: 0.0.0-use.local resolution: "@backstage/catalog-model@workspace:packages/catalog-model" dependencies: @@ -3814,7 +3840,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/config@^1.0.4, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": +"@backstage/config@^1.0.4, @backstage/config@^1.0.6, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": version: 0.0.0-use.local resolution: "@backstage/config@workspace:packages/config" dependencies: @@ -3860,7 +3886,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@^0.12.0, @backstage/core-components@^0.12.2, @backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": +"@backstage/core-components@^0.12.0, @backstage/core-components@^0.12.2, @backstage/core-components@^0.12.3, @backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": version: 0.0.0-use.local resolution: "@backstage/core-components@workspace:packages/core-components" dependencies: @@ -3931,7 +3957,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@^1.1.0, @backstage/core-plugin-api@^1.2.0, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": +"@backstage/core-plugin-api@^1.1.0, @backstage/core-plugin-api@^1.2.0, @backstage/core-plugin-api@^1.3.0, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": version: 0.0.0-use.local resolution: "@backstage/core-plugin-api@workspace:packages/core-plugin-api" dependencies: @@ -4016,7 +4042,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": +"@backstage/errors@^1.1.4, @backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": version: 0.0.0-use.local resolution: "@backstage/errors@workspace:packages/errors" dependencies: @@ -4046,7 +4072,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@^1.1.8, @backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": +"@backstage/integration-react@^1.1.9, @backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": version: 0.0.0-use.local resolution: "@backstage/integration-react@workspace:packages/integration-react" dependencies: @@ -4073,7 +4099,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": +"@backstage/integration@^1.4.2, @backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": version: 0.0.0-use.local resolution: "@backstage/integration@workspace:packages/integration" dependencies: @@ -5126,7 +5152,18 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-common@^1.0.8, @backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": +"@backstage/plugin-catalog-common@npm:^1.0.10, @backstage/plugin-catalog-common@npm:^1.0.8": + version: 1.0.10 + resolution: "@backstage/plugin-catalog-common@npm:1.0.10" + dependencies: + "@backstage/catalog-model": ^1.1.5 + "@backstage/plugin-permission-common": ^0.7.3 + "@backstage/plugin-search-common": ^1.2.1 + checksum: 3e09f8546aa3c58b4c6dd84beb8ca98378984463e6f05c3a73c9021a26bcf180f76607b735e00cb5af47b10122054781c7d1c7faa385e0708ba3e42e50676acf + languageName: node + linkType: hard + +"@backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-common@workspace:plugins/catalog-common" dependencies: @@ -5254,7 +5291,42 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@^1.2.1, @backstage/plugin-catalog-react@^1.2.3, @backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": +"@backstage/plugin-catalog-react@npm:^1.2.1, @backstage/plugin-catalog-react@npm:^1.2.3, @backstage/plugin-catalog-react@npm:^1.2.4": + version: 1.2.4 + resolution: "@backstage/plugin-catalog-react@npm:1.2.4" + dependencies: + "@backstage/catalog-client": ^1.3.0 + "@backstage/catalog-model": ^1.1.5 + "@backstage/core-components": ^0.12.3 + "@backstage/core-plugin-api": ^1.3.0 + "@backstage/errors": ^1.1.4 + "@backstage/integration": ^1.4.2 + "@backstage/plugin-catalog-common": ^1.0.10 + "@backstage/plugin-permission-common": ^0.7.3 + "@backstage/plugin-permission-react": ^0.4.9 + "@backstage/theme": ^0.2.16 + "@backstage/types": ^1.0.2 + "@backstage/version-bridge": ^1.0.3 + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@material-ui/lab": 4.0.0-alpha.57 + classnames: ^2.2.6 + jwt-decode: ^3.1.0 + lodash: ^4.17.21 + material-ui-popup-state: ^1.9.3 + qs: ^6.9.4 + react-use: ^17.2.4 + yaml: ^2.0.0 + zen-observable: ^0.10.0 + peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 + react: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: 2cbc65f713d2b04af21536e08756d49303030d8ae2e3450d228f81e44d59f9a1f52f3d3961d23169de4213f31414618d4dad7307e4e242b87899487eb118932c + languageName: node + linkType: hard + +"@backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-react@workspace:plugins/catalog-react" dependencies: @@ -6309,7 +6381,31 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-home@^0.4.29, @backstage/plugin-home@workspace:^, @backstage/plugin-home@workspace:plugins/home": +"@backstage/plugin-home@npm:^0.4.30": + version: 0.4.30 + resolution: "@backstage/plugin-home@npm:0.4.30" + dependencies: + "@backstage/catalog-model": ^1.1.5 + "@backstage/config": ^1.0.6 + "@backstage/core-components": ^0.12.3 + "@backstage/core-plugin-api": ^1.3.0 + "@backstage/plugin-catalog-react": ^1.2.4 + "@backstage/plugin-stack-overflow": ^0.1.10 + "@backstage/theme": ^0.2.16 + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@material-ui/lab": 4.0.0-alpha.57 + lodash: ^4.17.21 + react-use: ^17.2.4 + peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 + react: ^16.13.1 || ^17.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: 68420c7b2f94eec976bfeb9c8f704ef37554370e9c646e51de5582bc6fe7184b3021b08f85fbfca92a92b2efbe22261ac866799db4a75c9d10e9f14508cdcfb4 + languageName: node + linkType: hard + +"@backstage/plugin-home@workspace:^, @backstage/plugin-home@workspace:plugins/home": version: 0.0.0-use.local resolution: "@backstage/plugin-home@workspace:plugins/home" dependencies: @@ -6514,7 +6610,7 @@ __metadata: "@backstage/plugin-kubernetes-common": "workspace:^" "@google-cloud/container": ^4.0.0 "@jest-mock/express": ^2.0.1 - "@kubernetes/client-node": 0.18.0 + "@kubernetes/client-node": 0.18.1 "@types/aws4": ^1.5.1 "@types/express": ^4.17.6 "@types/http-proxy-middleware": ^0.19.3 @@ -6548,7 +6644,7 @@ __metadata: dependencies: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" - "@kubernetes/client-node": 0.18.0 + "@kubernetes/client-node": 0.18.1 languageName: unknown linkType: soft @@ -6567,7 +6663,7 @@ __metadata: "@backstage/plugin-kubernetes-common": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" - "@kubernetes/client-node": 0.18.0 + "@kubernetes/client-node": 0.18.1 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.57 @@ -6844,7 +6940,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": +"@backstage/plugin-permission-common@^0.7.3, @backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-common@workspace:plugins/permission-common" dependencies: @@ -6881,7 +6977,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react": +"@backstage/plugin-permission-react@^0.4.9, @backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-react@workspace:plugins/permission-react" dependencies: @@ -7076,6 +7172,7 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" "@backstage/plugin-scaffolder-backend": "workspace:^" + "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/types": "workspace:^" "@types/command-exists": ^1.2.0 "@types/fs-extra": ^9.0.1 @@ -7099,6 +7196,7 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" "@backstage/plugin-scaffolder-backend": "workspace:^" + "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/types": "workspace:^" "@types/command-exists": ^1.2.0 "@types/fs-extra": ^9.0.1 @@ -7121,7 +7219,7 @@ __metadata: "@backstage/dev-utils": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" - "@backstage/plugin-scaffolder-backend": "workspace:^" + "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/test-utils": "workspace:^" "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -7141,7 +7239,7 @@ __metadata: "@backstage/backend-common": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" - "@backstage/plugin-scaffolder-backend": "workspace:^" + "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/types": "workspace:^" winston: ^3.2.1 yeoman-environment: ^3.9.1 @@ -7166,6 +7264,7 @@ __metadata: "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-scaffolder-common": "workspace:^" + "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/types": "workspace:^" "@gitbeaker/core": ^35.6.0 "@gitbeaker/node": ^35.1.0 @@ -7225,6 +7324,20 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-scaffolder-node@workspace:^, @backstage/plugin-scaffolder-node@workspace:plugins/scaffolder-node": + version: 0.0.0-use.local + resolution: "@backstage/plugin-scaffolder-node@workspace:plugins/scaffolder-node" + dependencies: + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/catalog-model": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/plugin-scaffolder-common": "workspace:^" + "@backstage/types": "workspace:^" + jsonschema: ^1.2.6 + winston: ^3.2.1 + languageName: unknown + linkType: soft + "@backstage/plugin-scaffolder-react@workspace:^, @backstage/plugin-scaffolder-react@workspace:plugins/scaffolder-react": version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-react@workspace:plugins/scaffolder-react" @@ -7248,11 +7361,11 @@ __metadata: "@material-ui/icons": ^4.9.1 "@material-ui/lab": 4.0.0-alpha.57 "@rjsf/core": ^3.2.1 - "@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.16" + "@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.18" "@rjsf/material-ui": ^3.2.1 - "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.0.0-beta.16" - "@rjsf/utils": 5.0.0-beta.16 - "@rjsf/validator-ajv6": 5.0.0-beta.16 + "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.0.0-beta.18" + "@rjsf/utils": 5.0.0-beta.18 + "@rjsf/validator-ajv8": 5.0.0-beta.18 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7306,9 +7419,8 @@ __metadata: "@material-ui/lab": 4.0.0-alpha.57 "@react-hookz/web": ^20.0.0 "@rjsf/core": ^3.2.1 - "@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.16" "@rjsf/material-ui": ^3.2.1 - "@rjsf/utils": 5.0.0-beta.16 + "@rjsf/utils": 5.0.0-beta.18 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7430,7 +7542,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-search-common@workspace:^, @backstage/plugin-search-common@workspace:plugins/search-common": +"@backstage/plugin-search-common@^1.2.1, @backstage/plugin-search-common@workspace:^, @backstage/plugin-search-common@workspace:plugins/search-common": version: 0.0.0-use.local resolution: "@backstage/plugin-search-common@workspace:plugins/search-common" dependencies: @@ -7440,7 +7552,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-search-react@workspace:^, @backstage/plugin-search-react@workspace:plugins/search-react": +"@backstage/plugin-search-react@^1.4.0, @backstage/plugin-search-react@workspace:^, @backstage/plugin-search-react@workspace:plugins/search-react": version: 0.0.0-use.local resolution: "@backstage/plugin-search-react@workspace:plugins/search-react" dependencies: @@ -7687,6 +7799,31 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-stack-overflow@npm:^0.1.10": + version: 0.1.10 + resolution: "@backstage/plugin-stack-overflow@npm:0.1.10" + dependencies: + "@backstage/config": ^1.0.6 + "@backstage/core-components": ^0.12.3 + "@backstage/core-plugin-api": ^1.3.0 + "@backstage/plugin-home": ^0.4.30 + "@backstage/plugin-search-common": ^1.2.1 + "@backstage/plugin-search-react": ^1.4.0 + "@backstage/theme": ^0.2.16 + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@testing-library/jest-dom": ^5.10.1 + cross-fetch: ^3.1.5 + lodash: ^4.17.21 + qs: ^6.9.4 + react-use: ^17.2.4 + peerDependencies: + "@types/react": ^16.13.1 || ^17.0.0 + react: ^16.13.1 || ^17.0.0 + checksum: 118f98739a69e3baea4bd72cc165ef3a38166983c6ac3b94668c8dd6709ffedaeec186f21cc871af291a2243565305e4ccea030837020d2b32765ff565cbd2c1 + languageName: node + linkType: hard + "@backstage/plugin-stack-overflow@workspace:^, @backstage/plugin-stack-overflow@workspace:plugins/stack-overflow": version: 0.0.0-use.local resolution: "@backstage/plugin-stack-overflow@workspace:plugins/stack-overflow" @@ -8363,7 +8500,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/types@^1.0.1, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": +"@backstage/types@^1.0.1, @backstage/types@^1.0.2, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@backstage/types@workspace:packages/types" dependencies: @@ -8374,7 +8511,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/version-bridge@^1.0.2, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": +"@backstage/version-bridge@^1.0.2, @backstage/version-bridge@^1.0.3, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": version: 0.0.0-use.local resolution: "@backstage/version-bridge@workspace:packages/version-bridge" dependencies: @@ -9217,8 +9354,8 @@ __metadata: linkType: hard "@google-cloud/storage@npm:^6.0.0": - version: 6.9.0 - resolution: "@google-cloud/storage@npm:6.9.0" + version: 6.9.1 + resolution: "@google-cloud/storage@npm:6.9.1" dependencies: "@google-cloud/paginator": ^3.0.7 "@google-cloud/projectify": ^3.0.0 @@ -9237,7 +9374,7 @@ __metadata: retry-request: ^5.0.0 teeny-request: ^8.0.0 uuid: ^8.0.0 - checksum: 886b9aad6bd44901b22a6e77c6430bae0effc2137e6c18196d151db8b9690d80726ecc4b60ac1ba315372305010282de6b9845ef23eaa7351449d0193aac62cc + checksum: 9967bc0e80d1531f91030d27fc46cef0242f70dde2064b051104d8d261f1d3cba38b51789b0ae0850bf99b13d093365f85c85c43a2d9468d81f0f98238f76e78 languageName: node linkType: hard @@ -11072,33 +11209,31 @@ __metadata: languageName: node linkType: hard -"@kubernetes/client-node@npm:0.18.0": - version: 0.18.0 - resolution: "@kubernetes/client-node@npm:0.18.0" +"@kubernetes/client-node@npm:0.18.1": + version: 0.18.1 + resolution: "@kubernetes/client-node@npm:0.18.1" dependencies: "@types/js-yaml": ^4.0.1 - "@types/node": ^10.12.0 + "@types/node": ^18.11.17 "@types/request": ^2.47.1 - "@types/ws": ^6.0.1 + "@types/ws": ^8.5.3 byline: ^5.0.0 - execa: 5.0.0 - isomorphic-ws: ^4.0.1 + isomorphic-ws: ^5.0.0 js-yaml: ^4.1.0 - jsonpath-plus: ^0.19.0 + jsonpath-plus: ^7.2.0 openid-client: ^5.3.0 request: ^2.88.0 rfc4648: ^1.3.0 - shelljs: ^0.8.5 stream-buffers: ^3.0.2 tar: ^6.1.11 tmp-promise: ^3.0.2 tslib: ^2.4.1 underscore: ^1.13.6 - ws: ^7.3.1 + ws: ^8.11.0 dependenciesMeta: openid-client: optional: true - checksum: ea973ddf793b7351da5e1beaac461b8f2ae581cb6d65b62669f248f8cb345f0d54d4b888820fb49f471bc60bace37e706120f46d10d3726a63ccaed8b6cb401b + checksum: 7205f10256f182a0292d483195fab7f4d9b500b3a47e6861dcf2fa8851c0bfd554e4f9a9f832ff76500efefb0422df2ecf2e378c5c3a4290e86abd8bc69ef11d languageName: node linkType: hard @@ -11838,20 +11973,20 @@ __metadata: linkType: hard "@octokit/auth-app@npm:^4.0.0": - version: 4.0.8 - resolution: "@octokit/auth-app@npm:4.0.8" + version: 4.0.9 + resolution: "@octokit/auth-app@npm:4.0.9" dependencies: "@octokit/auth-oauth-app": ^5.0.0 "@octokit/auth-oauth-user": ^2.0.0 "@octokit/request": ^6.0.0 "@octokit/request-error": ^3.0.0 - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.0.0 "@types/lru-cache": ^5.1.0 deprecation: ^2.3.1 lru-cache: ^6.0.0 universal-github-app-jwt: ^1.1.1 universal-user-agent: ^6.0.0 - checksum: 819c048db51ee041697bb4cbba5fc39fbc0849e76cda63dd34ff9e77d60be62c5f93c478a9c1edf6643a88afaefc7aefe562e86b73f6ef6874df1bc797b9b617 + checksum: 3846ebeda40bf88684fa310741ec4b5838d57e18ba5c38986e422161e1ce95c750053fbb2aa18bdce120d6eb857d16bb8e9988597c3dfda40fec985dbdda1b2a languageName: node linkType: hard @@ -11999,13 +12134,13 @@ __metadata: linkType: hard "@octokit/graphql@npm:^5.0.0": - version: 5.0.4 - resolution: "@octokit/graphql@npm:5.0.4" + version: 5.0.5 + resolution: "@octokit/graphql@npm:5.0.5" dependencies: "@octokit/request": ^6.0.0 - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.0.0 universal-user-agent: ^6.0.0 - checksum: 8cf65cf7e6608cf3cbc96a2fa902172b4d5dc30e88ee0bae3711bf467a25b828b10cce1aaabb7f82a7580bfbcf7028b91d1dd1a894940945e38ca2deb6509754 + checksum: eb2d1a6305a3d1f55ff0ce92fb88b677f0bb789757152d58a79ef61171fb65ecf6fe18d6c27e236c0cee6a0c2600c2cb8370f5ac7184f8e9361c085aa4555bb1 languageName: node linkType: hard @@ -12091,6 +12226,13 @@ __metadata: languageName: node linkType: hard +"@octokit/openapi-types@npm:^16.0.0": + version: 16.0.0 + resolution: "@octokit/openapi-types@npm:16.0.0" + checksum: 844f30a545da380d63c712e0eb733366bc567d1aab34529c79fdfbec3d73810e81d83f06fdab13058a5cbc7dae786db1a9b90b5b61b1e606854ee45d5ec5f194 + languageName: node + linkType: hard + "@octokit/plugin-paginate-rest@npm:^2.6.2": version: 2.7.0 resolution: "@octokit/plugin-paginate-rest@npm:2.7.0" @@ -12124,14 +12266,14 @@ __metadata: languageName: node linkType: hard -"@octokit/plugin-paginate-rest@npm:^5.0.0": - version: 5.0.1 - resolution: "@octokit/plugin-paginate-rest@npm:5.0.1" +"@octokit/plugin-paginate-rest@npm:^6.0.0": + version: 6.0.0 + resolution: "@octokit/plugin-paginate-rest@npm:6.0.0" dependencies: - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.0.0 peerDependencies: "@octokit/core": ">=4" - checksum: cfded297d9f66c7607bd34075eb0c5f7278a1617d6be86115997c0757151c9be2fcf7a8849c2a5cebab56931a263b5cc35742b6227935afe77f5ed61b0627a3d + checksum: 4ad89568d883373898b733837cada7d849d51eef32157c11d4a81cef5ce8e509720d79b46918cada3c132f9b29847e383f17b7cd5c39ede7c93cdcd2f850b47f languageName: node linkType: hard @@ -12156,7 +12298,7 @@ __metadata: languageName: node linkType: hard -"@octokit/plugin-rest-endpoint-methods@npm:^6.0.0, @octokit/plugin-rest-endpoint-methods@npm:^6.7.0": +"@octokit/plugin-rest-endpoint-methods@npm:^6.0.0": version: 6.7.0 resolution: "@octokit/plugin-rest-endpoint-methods@npm:6.7.0" dependencies: @@ -12168,6 +12310,18 @@ __metadata: languageName: node linkType: hard +"@octokit/plugin-rest-endpoint-methods@npm:^7.0.0": + version: 7.0.1 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:7.0.1" + dependencies: + "@octokit/types": ^9.0.0 + deprecation: ^2.3.1 + peerDependencies: + "@octokit/core": ">=3" + checksum: cdb8734ec960f75acc2405284920c58efac9a71b1c3b2a71662b9100ffbc22dac597150acff017a93459c57e9a492d9e1c27872b068387dbb90597de75065fcf + languageName: node + linkType: hard + "@octokit/plugin-retry@npm:^3.0.9": version: 3.0.9 resolution: "@octokit/plugin-retry@npm:3.0.9" @@ -12227,16 +12381,16 @@ __metadata: linkType: hard "@octokit/request@npm:^6.0.0": - version: 6.2.2 - resolution: "@octokit/request@npm:6.2.2" + version: 6.2.3 + resolution: "@octokit/request@npm:6.2.3" dependencies: "@octokit/endpoint": ^7.0.0 "@octokit/request-error": ^3.0.0 - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.0.0 is-plain-object: ^5.0.0 node-fetch: ^2.6.7 universal-user-agent: ^6.0.0 - checksum: adbeb38807c60b53d32d9b69be0c1f861c26698bc6f5f3f7e05d26972290dc4867827dd333bdd801818c347e5723efd049a2b9848c6c8bf74a2032968dede0ff + checksum: fef4097be8375d20bb0b3276d8a3adf866ec628f2b0664d334f3c29b92157da847899497abdc7a5be540053819b55564990543175ad48f04e9e6f25f0395d4d3 languageName: node linkType: hard @@ -12253,14 +12407,14 @@ __metadata: linkType: hard "@octokit/rest@npm:^19.0.3": - version: 19.0.5 - resolution: "@octokit/rest@npm:19.0.5" + version: 19.0.7 + resolution: "@octokit/rest@npm:19.0.7" dependencies: "@octokit/core": ^4.1.0 - "@octokit/plugin-paginate-rest": ^5.0.0 + "@octokit/plugin-paginate-rest": ^6.0.0 "@octokit/plugin-request-log": ^1.0.4 - "@octokit/plugin-rest-endpoint-methods": ^6.7.0 - checksum: ed4c36859aafb64e23f7f708086fe7e2ecda17ffd8c1594817d539f766f5855af79f17f5d225d96d34cd9b97cbfea988dac3df39a7cc928b2d2b7b75ed981056 + "@octokit/plugin-rest-endpoint-methods": ^7.0.0 + checksum: 1f970c4de2cf3d1691d3cf5dd4bfa5ac205629e76417b5c51561e1beb5b4a7e6c65ba647f368727e67e5243418e06ca9cdafd9e733173e1529385d4f4d053d3d languageName: node linkType: hard @@ -12300,6 +12454,15 @@ __metadata: languageName: node linkType: hard +"@octokit/types@npm:^9.0.0": + version: 9.0.0 + resolution: "@octokit/types@npm:9.0.0" + dependencies: + "@octokit/openapi-types": ^16.0.0 + checksum: 5c7f5cca8f00f7c4daa0d00f4fe991c1598ec47cd6ced50b1c5fbe9721bb9dee0adc2acdee265a3a715bb984e53ef3dc7f1cfb7326f712c6d809d59fc5c6648d + languageName: node + linkType: hard + "@octokit/webhooks-methods@npm:^3.0.0": version: 3.0.2 resolution: "@octokit/webhooks-methods@npm:3.0.2" @@ -12389,8 +12552,8 @@ __metadata: linkType: hard "@oriflame/backstage-plugin-score-card@npm:^0.6.0": - version: 0.6.1 - resolution: "@oriflame/backstage-plugin-score-card@npm:0.6.1" + version: 0.6.2 + resolution: "@oriflame/backstage-plugin-score-card@npm:0.6.2" dependencies: "@backstage/catalog-model": ^1.1.3 "@backstage/config": ^1.0.4 @@ -12408,7 +12571,7 @@ __metadata: peerDependencies: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 - checksum: 745e90ece212759f8d3c018b2ebe282e38529c11b13f1b8446ebc548b3a1c2a4a5d1219b8476f79e93ad0e9a919f6efcd372a27f1c3bab61e8e3165921abe8f0 + checksum: 6c8ca85981fde5af8e3951f0f5fc9c3873c890d286fd29067215246e9b8e9022ceea308c9caa8b0ccfe5380fe5640aaede48c9963a57c3c98f5c3b5feade9aae languageName: node linkType: hard @@ -12594,9 +12757,9 @@ __metadata: languageName: node linkType: hard -"@rjsf/core-v5@npm:@rjsf/core@5.0.0-beta.16": - version: 5.0.0-beta.16 - resolution: "@rjsf/core@npm:5.0.0-beta.16" +"@rjsf/core-v5@npm:@rjsf/core@5.0.0-beta.18": + version: 5.0.0-beta.18 + resolution: "@rjsf/core@npm:5.0.0-beta.18" dependencies: lodash: ^4.17.15 lodash-es: ^4.17.15 @@ -12605,7 +12768,7 @@ __metadata: peerDependencies: "@rjsf/utils": ^5.0.0-beta.1 react: ^16.14.0 || >=17 - checksum: 38b0e02cfc394958d714f1c2b29262e95c5da01fbfffd657db7af8546ae5b00d1900fd0484be07be13d354dd1e48833cabcdcdaa8e9ffa0dfba63fba7e9556c3 + checksum: 1a2f2d43929790c20b6aeaa99b56bb02fc523edfa47eeffa29437dd80e337f9af5b4e4b274a637ac83e33b91799fda2a459e84903efe709def05018820f0fa83 languageName: node linkType: hard @@ -12628,16 +12791,16 @@ __metadata: languageName: node linkType: hard -"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.0.0-beta.16": - version: 5.0.0-beta.16 - resolution: "@rjsf/material-ui@npm:5.0.0-beta.16" +"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.0.0-beta.18": + version: 5.0.0-beta.18 + resolution: "@rjsf/material-ui@npm:5.0.0-beta.18" peerDependencies: "@material-ui/core": ^4.12.3 "@material-ui/icons": ^4.11.2 "@rjsf/core": ^5.0.0-beta.1 "@rjsf/utils": ^5.0.0-beta.1 react: ^16.14.0 || >=17 - checksum: b8252dd7edd07435c065393cf4a86f7a8db0224646f71206561f9d300fb8d39a658282b5181f1b0100b069f775620953c03f89818fecdf34c52076e39108b93f + checksum: b40a86d4aaeb863c1e7ce7fc0256adc0e4a8cfce510c6957fdc3385d0eac3292349501c1364b640fafbdce78e214ebb927199a2a5bdeb3d7814a7680bb8d8d44 languageName: node linkType: hard @@ -12653,9 +12816,9 @@ __metadata: languageName: node linkType: hard -"@rjsf/utils@npm:5.0.0-beta.16": - version: 5.0.0-beta.16 - resolution: "@rjsf/utils@npm:5.0.0-beta.16" +"@rjsf/utils@npm:5.0.0-beta.18": + version: 5.0.0-beta.18 + resolution: "@rjsf/utils@npm:5.0.0-beta.18" dependencies: json-schema-merge-allof: ^0.8.1 jsonpointer: ^5.0.1 @@ -12664,31 +12827,32 @@ __metadata: react-is: ^18.2.0 peerDependencies: react: ^16.14.0 || >=17 - checksum: 7a0f04f20b1b12eff33322bef322ee96e222fc621142fb34906cb18386a2a0dd97224fd97851899644994a1adaab33c6f107076f344b66108219fcb809132703 + checksum: ac71ec2a96449e70bb7aa8af901804e3152a94908607ee8b0be90249bf5ff571c69f63b55abc6f95f3f1ec12d9a0bf467013c08b9f4276ff31ce44a36ee72633 languageName: node linkType: hard -"@rjsf/validator-ajv6@npm:5.0.0-beta.16": - version: 5.0.0-beta.16 - resolution: "@rjsf/validator-ajv6@npm:5.0.0-beta.16" +"@rjsf/validator-ajv8@npm:5.0.0-beta.18": + version: 5.0.0-beta.18 + resolution: "@rjsf/validator-ajv8@npm:5.0.0-beta.18" dependencies: - ajv: ^6.7.0 + ajv: ^8.11.0 + ajv-formats: ^2.1.1 lodash: ^4.17.15 lodash-es: ^4.17.15 peerDependencies: - "@rjsf/utils": ^5.0.0-beta.1 - checksum: c4296e37608907c904424c46c884a15991101229e708caaa43e2e3c7d7e44a7e88ba206a902f80853f9a7f4c78d129fe47452ee5265cfd845b916051e99cd70d + "@rjsf/utils": ^5.0.0-beta.16 + checksum: eb4ca8b40a21bbca4f7dd67900aa4423aaaf3fa1e4d893c8a5d00e869b7fc44514e0f262b240556f22b4dc9363ce6e554046bb8c42d599c92d191fa5bee84d0d languageName: node linkType: hard "@roadiehq/backstage-plugin-buildkite@npm:^2.0.8": - version: 2.1.2 - resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.2" + version: 2.1.3 + resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.3" dependencies: - "@backstage/catalog-model": ^1.1.4 - "@backstage/core-components": ^0.12.2 - "@backstage/core-plugin-api": ^1.2.0 - "@backstage/plugin-catalog-react": ^1.2.3 + "@backstage/catalog-model": ^1.1.5 + "@backstage/core-components": ^0.12.3 + "@backstage/core-plugin-api": ^1.3.0 + "@backstage/plugin-catalog-react": ^1.2.4 "@backstage/theme": ^0.2.16 "@material-ui/core": ^4.12.1 "@material-ui/icons": ^4.11.2 @@ -12701,19 +12865,19 @@ __metadata: react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: fc607c7eac3a680db9ecc4c33bc65e84cdff432dc1079343f6e1ce66459324eba31a16a647b669c163e87c8b1794a01e66b4ba4f9fd77611d3081a0317cf68ac + checksum: d7716bc6588863ae845630beac21b2a0ea8e2af4d01af1be432161007576c9c73419b2496ce868062e5af4ef9e3d02e9140eee8840c48223ded79c63d3efbb24 languageName: node linkType: hard "@roadiehq/backstage-plugin-github-insights@npm:^2.0.5": - version: 2.3.2 - resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.3.2" + version: 2.3.3 + resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.3.3" dependencies: - "@backstage/catalog-model": ^1.1.4 - "@backstage/core-components": ^0.12.2 - "@backstage/core-plugin-api": ^1.2.0 - "@backstage/integration-react": ^1.1.8 - "@backstage/plugin-catalog-react": ^1.2.3 + "@backstage/catalog-model": ^1.1.5 + "@backstage/core-components": ^0.12.3 + "@backstage/core-plugin-api": ^1.3.0 + "@backstage/integration-react": ^1.1.9 + "@backstage/plugin-catalog-react": ^1.2.4 "@backstage/theme": ^0.2.16 "@date-io/core": 2.10.7 "@material-ui/core": ^4.11.0 @@ -12729,19 +12893,19 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 - checksum: 9c38cb944a9f37c3a0836dd4d5b41bc8329f124a026ce5f0c5ea467477ae87e6f699669c1c0873a9d29d791f6f870279bc7e83bc426111f540f8f6f54aad6f8a + checksum: e92b46ee34f8ae65a2cb796ae0d011a66e6dd5f731270b5925a314c706af471474316f2d489ef444c33747c3b5656e7ac74b8a39d6e4d777f5ccd3a992144f6a languageName: node linkType: hard "@roadiehq/backstage-plugin-github-pull-requests@npm:^2.2.7": - version: 2.4.2 - resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.4.2" + version: 2.4.3 + resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.4.3" dependencies: - "@backstage/catalog-model": ^1.1.4 - "@backstage/core-components": ^0.12.2 - "@backstage/core-plugin-api": ^1.2.0 - "@backstage/plugin-catalog-react": ^1.2.3 - "@backstage/plugin-home": ^0.4.29 + "@backstage/catalog-model": ^1.1.5 + "@backstage/core-components": ^0.12.3 + "@backstage/core-plugin-api": ^1.3.0 + "@backstage/plugin-catalog-react": ^1.2.4 + "@backstage/plugin-home": ^0.4.30 "@material-ui/core": ^4.11.0 "@material-ui/icons": ^4.9.1 "@material-ui/lab": ^4.0.0-alpha.60 @@ -12758,7 +12922,7 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 - checksum: d2b80b4c25a0bdca2e6dcd8ddf2fc26aa75374d5278fc235551fb213f3c0269e81cb141afd98c3a2a3073c39cfe35db69b1c265a615dd880777ab2e6c6a69d22 + checksum: 3d2d5d754921835088f1a34339e67938d3abdf673e267ee347526dac6c03afd4e0fdceca38090625654427c211ac2f52e78a7d2cad2347b56198bcfb9e00b95e languageName: node linkType: hard @@ -13284,90 +13448,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-darwin-arm64@npm:1.3.27" +"@swc/core-darwin-arm64@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-darwin-arm64@npm:1.3.28" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-darwin-x64@npm:1.3.27" +"@swc/core-darwin-x64@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-darwin-x64@npm:1.3.28" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.27" +"@swc/core-linux-arm-gnueabihf@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.28" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.27" +"@swc/core-linux-arm64-gnu@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.28" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.27" +"@swc/core-linux-arm64-musl@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.28" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.27" +"@swc/core-linux-x64-gnu@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.28" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-linux-x64-musl@npm:1.3.27" +"@swc/core-linux-x64-musl@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-linux-x64-musl@npm:1.3.28" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.27" +"@swc/core-win32-arm64-msvc@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.28" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.27" +"@swc/core-win32-ia32-msvc@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.28" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.27": - version: 1.3.27 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.27" +"@swc/core-win32-x64-msvc@npm:1.3.28": + version: 1.3.28 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.28" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.27 - resolution: "@swc/core@npm:1.3.27" + version: 1.3.28 + resolution: "@swc/core@npm:1.3.28" dependencies: - "@swc/core-darwin-arm64": 1.3.27 - "@swc/core-darwin-x64": 1.3.27 - "@swc/core-linux-arm-gnueabihf": 1.3.27 - "@swc/core-linux-arm64-gnu": 1.3.27 - "@swc/core-linux-arm64-musl": 1.3.27 - "@swc/core-linux-x64-gnu": 1.3.27 - "@swc/core-linux-x64-musl": 1.3.27 - "@swc/core-win32-arm64-msvc": 1.3.27 - "@swc/core-win32-ia32-msvc": 1.3.27 - "@swc/core-win32-x64-msvc": 1.3.27 + "@swc/core-darwin-arm64": 1.3.28 + "@swc/core-darwin-x64": 1.3.28 + "@swc/core-linux-arm-gnueabihf": 1.3.28 + "@swc/core-linux-arm64-gnu": 1.3.28 + "@swc/core-linux-arm64-musl": 1.3.28 + "@swc/core-linux-x64-gnu": 1.3.28 + "@swc/core-linux-x64-musl": 1.3.28 + "@swc/core-win32-arm64-msvc": 1.3.28 + "@swc/core-win32-ia32-msvc": 1.3.28 + "@swc/core-win32-x64-msvc": 1.3.28 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -13389,7 +13553,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: 1e43612e65bd223e32db59497ea0bd1345a6da6ae1c4bb42556f1948da1175035c92b7a2b4dda76bfd4f7b229e885756cd9ec36af876e4e3da3f48cb4ba2fa0d + checksum: bc96bb6cf476bf815d2f9308b280c119f8c8ecc4e9ba459322415d884c21dcad040ae8c69646811e598e0039ab497c8f15031c331fd6d13ea5bdf848b9c9f44f languageName: node linkType: hard @@ -13816,11 +13980,11 @@ __metadata: linkType: hard "@types/codemirror@npm:^5.0.0": - version: 5.60.6 - resolution: "@types/codemirror@npm:5.60.6" + version: 5.60.7 + resolution: "@types/codemirror@npm:5.60.7" dependencies: "@types/tern": "*" - checksum: 10b8c2a689f9ed610b0048d9d5ded1a7eb90c45014156b84b41c4f52f4720172414f7172d56f13c8a0b35d429704fb9d240414cf205776c807caa39105b33481 + checksum: 0312ce032eb139b408588a7e7cf3b392a510a2cfa6f477f2dd20d8bca1990e5e6e5540e708f9a69d1a58e68ea7fd234b789c801aa7ef4f3b3dc32a1478b04a91 languageName: node linkType: hard @@ -14172,9 +14336,9 @@ __metadata: linkType: hard "@types/event-source-polyfill@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/event-source-polyfill@npm:1.0.0" - checksum: 5b3eacace596ce8c1c3f877ea7967e9634922faa7187f9d4000fd3d7b765f84917603dbc95c98d28ff592e80cb7bc588166ec9ea841d262be0d919bf9ed79c14 + version: 1.0.1 + resolution: "@types/event-source-polyfill@npm:1.0.1" + checksum: 37f3ccc40e2fc43230047c3323f8bfc55f6ed40aee8c61af7f6b702a923be5615362cf3241f5a536f9c64932309a2184a0181bb48e105a94b968b8321cae1c60 languageName: node linkType: hard @@ -14186,13 +14350,13 @@ __metadata: linkType: hard "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.18, @types/express-serve-static-core@npm:^4.17.31, @types/express-serve-static-core@npm:^4.17.5": - version: 4.17.32 - resolution: "@types/express-serve-static-core@npm:4.17.32" + version: 4.17.33 + resolution: "@types/express-serve-static-core@npm:4.17.33" dependencies: "@types/node": "*" "@types/qs": "*" "@types/range-parser": "*" - checksum: 70ec1b8f386628850b315a7b9fd4240a5a70297b41ef1c39af65c8b9661d2c775cfff4686b491fd90e5b6eef43088af203700c5541aec0d063db0c6cbeff254c + checksum: dce580d16b85f207445af9d4053d66942b27d0c72e86153089fa00feee3e96ae336b7bedb31ed4eea9e553c99d6dd356ed6e0928f135375d9f862a1a8015adf2 languageName: node linkType: hard @@ -14444,12 +14608,12 @@ __metadata: linkType: hard "@types/jest@npm:*, @types/jest@npm:^29.0.0": - version: 29.2.5 - resolution: "@types/jest@npm:29.2.5" + version: 29.2.6 + resolution: "@types/jest@npm:29.2.6" dependencies: expect: ^29.0.0 pretty-format: ^29.0.0 - checksum: d668470f00ec4cb8b8457f1fd90f7358fad8f22d74b85006dad6be522d6b9bf10f49f597e88d1d1a518d211c1b65be32a1f27f0e49ce0658d110a9206b8ea310 + checksum: 90190ac830334af1470d255853f9621fe657e5030b4d96773fc1f884833cd303c76580b00c1b86dc38a8db94f1c7141d462190437a10af31852b8845a57c48ba languageName: node linkType: hard @@ -14753,7 +14917,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>= 8, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": +"@types/node@npm:*, @types/node@npm:>= 8, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0, @types/node@npm:^18.11.17": version: 18.11.18 resolution: "@types/node@npm:18.11.18" checksum: 03f17f9480f8d775c8a72da5ea7e9383db5f6d85aa5fefde90dd953a1449bd5e4ffde376f139da4f3744b4c83942166d2a7603969a6f8ea826edfb16e6e3b49d @@ -14767,7 +14931,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^10.1.0, @types/node@npm:^10.12.0": +"@types/node@npm:^10.1.0": version: 10.17.60 resolution: "@types/node@npm:10.17.60" checksum: 2cdb3a77d071ba8513e5e8306fa64bf50e3c3302390feeaeff1fd325dd25c8441369715dfc8e3701011a72fed5958c7dfa94eb9239a81b3c286caa4d97db6eef @@ -15453,21 +15617,12 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^6.0.1": - version: 6.0.4 - resolution: "@types/ws@npm:6.0.4" +"@types/ws@npm:^8.0.0, @types/ws@npm:^8.5.1, @types/ws@npm:^8.5.3": + version: 8.5.4 + resolution: "@types/ws@npm:8.5.4" dependencies: "@types/node": "*" - checksum: b2656a76bfad0c17bb1e3fc237ba7122431c1373669977ed8edef45934c82f71c75d8c71f0a576dc6d98b0954fd94cae0166c6b4ccb40f7e0ee29cc92673519c - languageName: node - linkType: hard - -"@types/ws@npm:^8.0.0, @types/ws@npm:^8.5.1": - version: 8.5.3 - resolution: "@types/ws@npm:8.5.3" - dependencies: - "@types/node": "*" - checksum: 0ce46f850d41383fcdc2149bcacc86d7232fa7a233f903d2246dff86e31701a02f8566f40af5f8b56d1834779255c04ec6ec78660fe0f9b2a69cf3d71937e4ae + checksum: fefbad20d211929bb996285c4e6f699b12192548afedbe4930ab4384f8a94577c9cd421acaad163cacd36b88649509970a05a0b8f20615b30c501ed5269038d1 languageName: node linkType: hard @@ -15716,9 +15871,9 @@ __metadata: languageName: node linkType: hard -"@uiw/codemirror-extensions-basic-setup@npm:4.19.6": - version: 4.19.6 - resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.19.6" +"@uiw/codemirror-extensions-basic-setup@npm:4.19.7": + version: 4.19.7 + resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.19.7" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/commands": ^6.0.0 @@ -15735,19 +15890,19 @@ __metadata: "@codemirror/search": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: 775c6c190b27ed0ffeb9fec9b03c60a4d621f33480e7c878c3841cb0fa983baab46d13612d7ac9a14a3e810b83d9ab12aa387a291e5e5a0726bf33f28d89d1c0 + checksum: 4c32d3b41b78776fd41b229edc8777dff4137ff6125836df5a6573e01a0a74f2ae66293a09a3b095a1fbe660b2fc8b2bde93ba4aa92636702a74baea261fcf94 languageName: node linkType: hard "@uiw/react-codemirror@npm:^4.9.3": - version: 4.19.6 - resolution: "@uiw/react-codemirror@npm:4.19.6" + version: 4.19.7 + resolution: "@uiw/react-codemirror@npm:4.19.7" dependencies: "@babel/runtime": ^7.18.6 "@codemirror/commands": ^6.1.0 "@codemirror/state": ^6.1.1 "@codemirror/theme-one-dark": ^6.0.0 - "@uiw/codemirror-extensions-basic-setup": 4.19.6 + "@uiw/codemirror-extensions-basic-setup": 4.19.7 codemirror: ^6.0.0 peerDependencies: "@babel/runtime": ">=7.11.0" @@ -15757,7 +15912,7 @@ __metadata: codemirror: ">=6.0.0" react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 64c0374dd221e7ddab2f8c2531ad5271f595fad116e37b45acaa9f1d8b8d5659bccdd4aea47a558cce4c62d46e90b8d074760a5b328e9e99c253c79ec99e8b6a + checksum: 333c7b0c7181219bb0506cd956eb10fa07aad5f26d3c5a9e7b9875e6c60f1e9bf1c8f74bf160735c75b7dbe9e9b05879c17f5ea641e212ba8f454887f04b0e7e languageName: node linkType: hard @@ -16211,7 +16366,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.8.0": +"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.11.0, ajv@npm:^8.8.0": version: 8.12.0 resolution: "ajv@npm:8.12.0" dependencies: @@ -17021,15 +17176,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:^0.25.0": - version: 0.25.0 - resolution: "axios@npm:0.25.0" - dependencies: - follow-redirects: ^1.14.7 - checksum: 2a8a3787c05f2a0c9c3878f49782357e2a9f38945b93018fb0c4fd788171c43dceefbb577988628e09fea53952744d1ecebde234b561f1e703aa43e0a598a3ad - languageName: node - linkType: hard - "axios@npm:^0.27.2": version: 0.27.2 resolution: "axios@npm:0.27.2" @@ -19188,9 +19334,9 @@ __metadata: linkType: hard "cookiejar@npm:^2.1.3": - version: 2.1.3 - resolution: "cookiejar@npm:2.1.3" - checksum: 88259983ebc52ceb23cdacfa48762b6a518a57872eff1c7ed01d214fff5cf492e2660d7d5c04700a28f1787a76811df39e8639f8e17670b3cf94ecd86e161f07 + version: 2.1.4 + resolution: "cookiejar@npm:2.1.4" + checksum: c4442111963077dc0e5672359956d6556a195d31cbb35b528356ce5f184922b99ac48245ac05ed86cf993f7df157c56da10ab3efdadfed79778a0d9b1b092d5b languageName: node linkType: hard @@ -19228,9 +19374,9 @@ __metadata: linkType: hard "core-js@npm:^3.4.1, core-js@npm:^3.6.5": - version: 3.27.1 - resolution: "core-js@npm:3.27.1" - checksum: d50b5f88aea4302512ad9446c18e90f4d35dea1e6d8d3f87337690677061565ff11a670f1e0c87de57aa6074375fbb25ed5784076c040d3c4de8b4bce7d2ebeb + version: 3.27.2 + resolution: "core-js@npm:3.27.2" + checksum: 718debd426f55a6b97cf9b757c936be258afd6d4f7052f89d0f96c982d7013e9000b0b006df42831a0cf32adad298e34d6a19052dce9ae1c7ab87162c0c665e0 languageName: node linkType: hard @@ -22352,23 +22498,6 @@ __metadata: languageName: node linkType: hard -"execa@npm:5.0.0": - version: 5.0.0 - resolution: "execa@npm:5.0.0" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.0 - human-signals: ^2.1.0 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.1 - onetime: ^5.1.2 - signal-exit: ^3.0.3 - strip-final-newline: ^2.0.0 - checksum: a044367ebdcc68ca019810cb134510fc77bbc55c799122258ee0e00e289c132941ab48c2a331a036699c42bc8d479d451ae67c105fce5ce5cc813e7dd92d642b - languageName: node - linkType: hard - "execa@npm:5.1.1, execa@npm:^5.0.0": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -23067,7 +23196,7 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.14.7, follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.14.9": +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.14.9": version: 1.15.2 resolution: "follow-redirects@npm:1.15.2" peerDependenciesMeta: @@ -25919,7 +26048,7 @@ __metadata: languageName: node linkType: hard -"isomorphic-ws@npm:5.0.0": +"isomorphic-ws@npm:5.0.0, isomorphic-ws@npm:^5.0.0": version: 5.0.0 resolution: "isomorphic-ws@npm:5.0.0" peerDependencies: @@ -25928,15 +26057,6 @@ __metadata: languageName: node linkType: hard -"isomorphic-ws@npm:^4.0.1": - version: 4.0.1 - resolution: "isomorphic-ws@npm:4.0.1" - peerDependencies: - ws: "*" - checksum: d7190eadefdc28bdb93d67b5f0c603385aaf87724fa2974abb382ac1ec9756ed2cfb27065cbe76122879c2d452e2982bc4314317f3d6c737ddda6c047328771a - languageName: node - linkType: hard - "isstream@npm:~0.1.2": version: 0.1.2 resolution: "isstream@npm:0.1.2" @@ -26633,7 +26753,7 @@ __metadata: languageName: node linkType: hard -"joi@npm:^17.6.0": +"joi@npm:^17.7.0": version: 17.7.0 resolution: "joi@npm:17.7.0" dependencies: @@ -27117,13 +27237,13 @@ __metadata: linkType: hard "json5@npm:^1.0.1": - version: 1.0.1 - resolution: "json5@npm:1.0.1" + version: 1.0.2 + resolution: "json5@npm:1.0.2" dependencies: minimist: ^1.2.0 bin: json5: lib/cli.js - checksum: e76ea23dbb8fc1348c143da628134a98adf4c5a4e8ea2adaa74a80c455fc2cdf0e2e13e6398ef819bfe92306b610ebb2002668ed9fc1af386d593691ef346fc3 + checksum: 866458a8c58a95a49bef3adba929c625e82532bcff1fe93f01d29cb02cac7c3fe1f4b79951b7792c2da9de0b32871a8401a6e3c5b36778ad852bf5b8a61165d7 languageName: node linkType: hard @@ -27182,13 +27302,6 @@ __metadata: languageName: node linkType: hard -"jsonpath-plus@npm:^0.19.0": - version: 0.19.0 - resolution: "jsonpath-plus@npm:0.19.0" - checksum: defd19990df6e45cb45c4c1c5185139995a5ead40967acc373b32375ace83d329bb96c0b69c0ae9a8c581b6c4bdb82f8b56766053c9251d4d9158161f1ba8d70 - languageName: node - linkType: hard - "jsonpath-plus@npm:^5.0.7": version: 5.1.0 resolution: "jsonpath-plus@npm:5.1.0" @@ -27196,6 +27309,13 @@ __metadata: languageName: node linkType: hard +"jsonpath-plus@npm:^7.2.0": + version: 7.2.0 + resolution: "jsonpath-plus@npm:7.2.0" + checksum: 05f447339d29be861e307d6e812aec1b9b88a3ba6bba286966a4e8bed3e752bee3d715eabfc21dce968be85ccb48bf79d2c1af78da7b9b74cd1b446d4d5d02f5 + languageName: node + linkType: hard + "jsonpointer@npm:^5.0.0, jsonpointer@npm:^5.0.1": version: 5.0.1 resolution: "jsonpointer@npm:5.0.1" @@ -27481,8 +27601,8 @@ __metadata: linkType: hard "knex@npm:^2.0.0": - version: 2.4.0 - resolution: "knex@npm:2.4.0" + version: 2.4.2 + resolution: "knex@npm:2.4.2" dependencies: colorette: 2.0.19 commander: ^9.1.0 @@ -27515,7 +27635,7 @@ __metadata: optional: true bin: knex: bin/cli.js - checksum: 66b4ae8412c61125b78512a66d924af95116628e16026efce4d03b80b2ced6b63208b37bb49fb52a499761da5e8981e136b48fcefcd48c3fe9fc72d9d17c5661 + checksum: cfb6436c0e3df3cd1f55d3637e4f222d1acbc7b6ec3757e52c92cbf0a7da4055d40156d707ffede57dc155af75d7f5739a49d1b31d8755bc77bc0e4e2a570748 languageName: node linkType: hard @@ -29319,7 +29439,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.7": version: 1.2.7 resolution: "minimist@npm:1.2.7" checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec @@ -34490,12 +34610,12 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.0.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.4, rxjs@npm:^7.5.5, rxjs@npm:^7.5.6": - version: 7.6.0 - resolution: "rxjs@npm:7.6.0" +"rxjs@npm:^7.0.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.5.6, rxjs@npm:^7.8.0": + version: 7.8.0 + resolution: "rxjs@npm:7.8.0" dependencies: tslib: ^2.1.0 - checksum: b3abbbfe1ddfd06fca9314b83cbd13bcddc3320429218136f75c79a4802ac430dd13873364aac1ded54fd457f8c77df332d205a92d8a1c61656565bb718c50af + checksum: 61b4d4fd323c1043d8d6ceb91f24183b28bcf5def4f01ca111511d5c6b66755bc5578587fe714ef5d67cf4c9f2e26f4490d4e1d8cabf9bd5967687835e9866a2 languageName: node linkType: hard @@ -35660,8 +35780,8 @@ __metadata: linkType: hard "start-server-and-test@npm:^1.10.11": - version: 1.15.2 - resolution: "start-server-and-test@npm:1.15.2" + version: 1.15.3 + resolution: "start-server-and-test@npm:1.15.3" dependencies: arg: ^5.0.2 bluebird: 3.7.2 @@ -35670,12 +35790,12 @@ __metadata: execa: 5.1.1 lazy-ass: 1.6.0 ps-tree: 1.2.0 - wait-on: 6.0.1 + wait-on: 7.0.1 bin: server-test: src/bin/start.js start-server-and-test: src/bin/start.js start-test: src/bin/start.js - checksum: 3334959d8c7fb72b9a88672f531a21a90146e8c855d2f8a4aca57b116221e3d0db4dd23a572c02bf2e08cc30266dde9f95cb7e53089223e1e1c5dc8ac44c3d20 + checksum: 3489c5146e26bc3bfa34d12f546f78fa6d883fdd49d0c60cbf4fb76ef627df6cde0a878253f5ca8e2177b938c00f47c613a811f6e7aa519af3be58576fbc2ab0 languageName: node linkType: hard @@ -37299,9 +37419,9 @@ __metadata: linkType: hard "ua-parser-js@npm:^0.7.18": - version: 0.7.28 - resolution: "ua-parser-js@npm:0.7.28" - checksum: a7da4ad54527211e878ee016c2ef64efad5c2f5a31277d36c9da93b4c89ecaa64f391ad4cf158ada76a9ad8e53004a950705ff1c2f27a52ca8bfb3f1381c39ff + version: 0.7.33 + resolution: "ua-parser-js@npm:0.7.33" + checksum: 1510e9ec26fcaf0d8c6ae8f1078a8230e8816f083e1b5f453ea19d06b8ef2b8a596601c92148fd41899e8b3e5f83fa69c42332bd5729b931a721040339831696 languageName: node linkType: hard @@ -38109,18 +38229,18 @@ __metadata: languageName: node linkType: hard -"wait-on@npm:6.0.1": - version: 6.0.1 - resolution: "wait-on@npm:6.0.1" +"wait-on@npm:7.0.1": + version: 7.0.1 + resolution: "wait-on@npm:7.0.1" dependencies: - axios: ^0.25.0 - joi: ^17.6.0 + axios: ^0.27.2 + joi: ^17.7.0 lodash: ^4.17.21 - minimist: ^1.2.5 - rxjs: ^7.5.4 + minimist: ^1.2.7 + rxjs: ^7.8.0 bin: wait-on: bin/wait-on - checksum: e4d62aa4145d99fe34747ccf7506d4b4d6e60dd677c0eb18a51e316d38116ace2d194e4b22a9eb7b767b0282f39878ddcc4ae9440dcb0c005c9150668747cf5b + checksum: 1e8a17d8ee6436f71d3ab82781ce31267481fcd7bbccde49b0f8124871e6e40a1acac3401f04f775ba6203853a5813352fa131620fc139914351f3b2894d573f languageName: node linkType: hard @@ -38651,7 +38771,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.11.0, ws@npm:^8.4.2, ws@npm:^8.8.0": +"ws@npm:8.11.0": version: 8.11.0 resolution: "ws@npm:8.11.0" peerDependencies: @@ -38681,7 +38801,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^5.2.0 || ^6.0.0 || ^7.0.0, ws@npm:^7.3.1, ws@npm:^7.4.6": +"ws@npm:^5.2.0 || ^6.0.0 || ^7.0.0, ws@npm:^7.4.6": version: 7.5.9 resolution: "ws@npm:7.5.9" peerDependencies: @@ -38696,6 +38816,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.11.0, ws@npm:^8.4.2, ws@npm:^8.8.0": + version: 8.12.0 + resolution: "ws@npm:8.12.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 818ff3f8749c172a95a114cceb8b89cedd27e43a82d65c7ad0f7882b1e96a2ee6709e3746a903c3fa88beec0c8bae9a9fcd75f20858b32a166dfb7519316a5d7 + languageName: node + linkType: hard + "ws@npm:~7.4.2": version: 7.4.6 resolution: "ws@npm:7.4.6"