From ff176942c83b57bcac879214646175737794785a Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 28 Feb 2024 10:57:31 +0100 Subject: [PATCH 001/136] docs/frontend-system: starting point for app config docs Signed-off-by: Patrik Oldsberg --- .../02-configuring-extensions.md | 90 ++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/docs/frontend-system/building-apps/02-configuring-extensions.md b/docs/frontend-system/building-apps/02-configuring-extensions.md index 2fd4ce69fc..57a2110da6 100644 --- a/docs/frontend-system/building-apps/02-configuring-extensions.md +++ b/docs/frontend-system/building-apps/02-configuring-extensions.md @@ -6,4 +6,92 @@ sidebar_label: Configuring Extensions description: Documentation for how to configure extensions in a Backstage app --- -TODO +All extensions in a Backstage app can be configured through static configuration. This configuration is all done under a the `app.extensions` configuration key. For more general information on how to write configuration for Backstage, see the section on [writing configuration](../../conf/writing.md). + +## Extension Configuration Schema + +This section focuses on the format of the `app.extensions` configuration and the various shorthands that are available. + +The most complete and verbose format for configuring an individual extensions is as follows: + +```yaml +app: + extensions: + - : + attachTo: + id: + input: + disabled: + config: +``` + +All of the top-level fields are optional: `attachTo`, `disabled`, and `config`. Every extension implementation must provide defaults for all of these fields that will be used if they are not provided in the configuration. + +Note that `app.extensions` is always an array rather than an object. For example, the following is invalid: + +```yaml title="INVALID" +app: + extensions: + : # Invalid, this should be an array item, `app.extensions` is now an object + config: ... +``` + +In addition to this schema, there are a number of shorthands available: + +Rather than a full object, you can specify just the ID of the extension as a string. This is equivalent to setting `disabled` to `false`: + +```yaml +app: + extensions: + - ‘’ +``` + +You can enable/disable individual extension by ID, in this case the value is a boolean: + +```yaml +extensions: + - : +``` + +You can override the implementation of an extension by ID, in this case the value is a string: + +```yaml +extensions: + - : ‘’ +``` + +You can **create a new extension instance with a generated ID** by including an input name in the key: + +```yaml +extensions: + - /: + extension: + config: +``` + +This syntax is only for use in the app configuration itself, every extension provided by default from a plugin must have an explicit ID. For example, the following two configurations are equivalent, except that the former does not have an explicit instance ID: + +```yaml +extensions: + # Generated ID + - core.router/routes: + extension: '@backstage/plugin-tech-radar#TechRadarPage' + # Explicit ID + - tech-radar.page: + at: core.router/routes + extension: '@backstage/plugin-tech-radar#TechRadarPage' +``` + +Lastly, if you do not need to provide additional configuration, you can combine the key input format with the implementation value format as a shorthand for creating a new extension instance with a generated ID and no configuration: + +```yaml +extensions: + - /: ‘’ +``` + +For example: + +```yaml +extensions: + - core.router/routes: '@backstage/plugin-tech-radar#TechRadarPage' +``` From faf3fdf3ada5f922976baa0bcc82be7d2f69b00e Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Wed, 28 Feb 2024 15:54:41 +0100 Subject: [PATCH 002/136] docs: add more examples to the frontend app migration guide Signed-off-by: Camila Belo --- .../building-apps/08-migrating.md | 116 +++++++++++++++++- 1 file changed, 113 insertions(+), 3 deletions(-) diff --git a/docs/frontend-system/building-apps/08-migrating.md b/docs/frontend-system/building-apps/08-migrating.md index 98d8b3bab8..8bcc1f973f 100644 --- a/docs/frontend-system/building-apps/08-migrating.md +++ b/docs/frontend-system/building-apps/08-migrating.md @@ -117,7 +117,7 @@ You can then also add any additional extensions that you may need to create as p [Utility API](../utility-apis/01-index.md) factories are now installed as extensions instead. Pass the existing factory to `createApiExtension` and install it in the app. For more information, see the section on [configuring Utility APIs](../utility-apis/04-configuring.md). -For example, the following API configuration: +For example, the following apis configuration: ```ts const app = createApp({ @@ -151,15 +151,75 @@ Icons are currently installed through the usual options to `createApp`, but will Plugins are now passed through the `features` options instead. +For example, the following plugins configuration: + +```tsx +import { homePlugin } from '@backstage/plugin-home'; + +createApp({ + // ... + plugins: [homePlugin], + // ... +}); +``` + +Can be converted to the following features configuration: + +```tsx +// plugins are now default exported via alpha subpath +import homePlugin from '@backstage/plugin-home/alpha'; + +createApp({ + // ... + features: [homePlugin], + // ... +}); +``` + +Plugins don't even have to be imported manually after installing their package if [features discovery](../architecture/02-app.md#feature-discovery) is enabled. + +```yaml title="in app-config.yaml" +app: + # Enabling plugin and override features discovery + experimental: 'all' +``` + ### `featureFlags` Declaring features flags in the app is no longer supported, move these declarations to the appropriate plugins instead. +For example, the following app feature flags configuration: + +```tsx +createApp({ + // ... + featureFlags: [ + { + pluginId: '', + name: 'tech-radar', + description: 'Enables the tech radar plugin', + }, + ], + // ... +}); +``` + +Can be converted to the following plugin configuration: + +```tsx +createPlugin({ + id: 'tech-radar', + // ... + featureFlags: [{ name: 'tech-radar' }], + // ... +}); +``` + ### `components` Many app components are now installed as extensions instead using `createComponentExtension`. See the section on [configuring app components](./01-index.md#configure-your-app) for more information. -The `Router` component is now a built-in extension that you can override using `createRouterExtension`. +The `Router` component is now a built-in extension that you can [override](../architecture/05-extension-overrides.md) using `createRouterExtension`. The Sign-in page is now installed as an extension using the `createSignInPageExtension` instead. @@ -277,6 +337,35 @@ const app = createApp({ Translations are now installed as extensions, using `createTranslationExtension`. +For example, the following translations configuration: + +```tsx +import { catalogTranslationRef } from '@backstage/plugin-catalog/alpha'; +createApp({ + // ... + __experimentalTranslations: { + resources: [ + createTranslationMessages({ + ref: catalogTranslationRef, + catalog_page_create_button_title: 'Create Software', + }), + ], + }, + // ... +}); +``` + +Can be converted to the following extension: + +```tsx +createTranslationExtension({ + resource: createTranslationMessages({ + ref: catalogTranslationRef, + catalog_page_create_button_title: 'Create Software', + }), +}); +``` + ## Gradual Migration After updating all `createApp` options as well as using `convertLegacyApp` to use your existing app structure, you should be able to start up the app and see that it still works. If that is not the case, make sure you read any error messages that you may see in the app as they can provide hints on what you need to fix. If you are still stuck, you can check if anyone else ran into the same issue in our [GitHub issues](https://github.com/backstage/backstage/issues), or ask for help in our [community Discord](https://discord.gg/backstage-687207715902193673). @@ -368,7 +457,7 @@ The entity pages are typically defined in `packages/app/src/components/catalog` New apps feature a built-in sidebar extension (`app/nav`) that will render all nav item extensions provided by plugins. This is a placeholder implementation and not intended as a long-term solution. In the future we will aim to provide a more flexible sidebar extension that allows for more customization out of the box. -Because the built-in sidebar is quite limited you may want to override the sidebar with your own custom implementation. To do so, use `createExtension` directly and refer to the [original sidebar implementation](https://github.com/backstage/backstage/blob/master/packages/frontend-app-api/src/extensions/AppNav.tsx). The following is an example of how to take your existing sidebar from the `Root` component that you typically find in `packages/app/src/components/Root.tsx`, and use it in an extension override: +Because the built-in sidebar is quite limited you may want to override the sidebar with your own custom implementation. To do so, use `createExtension` directly and refer to the [original sidebar implementation](https://github.com/backstage/backstage/blob/master/packages/frontend-app-api/src/extensions/AppNav.tsx). The following is an example of how to take your existing sidebar from the `Root` component that you typically find in `packages/app/src/components/Root.tsx`, and use it in an [extension override](../architecture/05-extension-overrides.md): ```tsx const nav = createExtension({ @@ -435,3 +524,24 @@ export default app.createRoot( ``` Any app root wrapper needs to be migrated to be an extension, using `createAppRootWrapperExtension`. Note that if you have multiple wrappers they must be completely independent of each other, i.e. the order in which they the appear in the React tree should not matter. If that is not the case then you should group them into a single wrapper. + +Here is an example converting the `CustomAppBarrier` into extension: + +```tsx +createApp({ + // ... + features: [ + createExtensionOverrides({ + extensions: [ + createAppRootWrapperExtension({ + name: 'CustomAppBarrier', + // Whenever your component uses legacy core packages, wrap it with "compatWrapper" + // e.g. props => compatWrapper() + Component: CustomAppBarrier, + }), + ], + }), + ], + // ... +}); +``` From e2e39faa710b09ed0fa6cfebd32987d1e1b39129 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 1 Mar 2024 11:37:05 +0100 Subject: [PATCH 003/136] docs/frontend-system: removed outdated content from app config section Signed-off-by: Patrik Oldsberg --- .../02-configuring-extensions.md | 48 ++----------------- 1 file changed, 3 insertions(+), 45 deletions(-) diff --git a/docs/frontend-system/building-apps/02-configuring-extensions.md b/docs/frontend-system/building-apps/02-configuring-extensions.md index 57a2110da6..5f090e23cd 100644 --- a/docs/frontend-system/building-apps/02-configuring-extensions.md +++ b/docs/frontend-system/building-apps/02-configuring-extensions.md @@ -49,49 +49,7 @@ app: You can enable/disable individual extension by ID, in this case the value is a boolean: ```yaml -extensions: - - : -``` - -You can override the implementation of an extension by ID, in this case the value is a string: - -```yaml -extensions: - - : ‘’ -``` - -You can **create a new extension instance with a generated ID** by including an input name in the key: - -```yaml -extensions: - - /: - extension: - config: -``` - -This syntax is only for use in the app configuration itself, every extension provided by default from a plugin must have an explicit ID. For example, the following two configurations are equivalent, except that the former does not have an explicit instance ID: - -```yaml -extensions: - # Generated ID - - core.router/routes: - extension: '@backstage/plugin-tech-radar#TechRadarPage' - # Explicit ID - - tech-radar.page: - at: core.router/routes - extension: '@backstage/plugin-tech-radar#TechRadarPage' -``` - -Lastly, if you do not need to provide additional configuration, you can combine the key input format with the implementation value format as a shorthand for creating a new extension instance with a generated ID and no configuration: - -```yaml -extensions: - - /: ‘’ -``` - -For example: - -```yaml -extensions: - - core.router/routes: '@backstage/plugin-tech-radar#TechRadarPage' +app: + extensions: + - : ``` From 0b501431e0f528c4c6928b46b0d1372d6a919ea6 Mon Sep 17 00:00:00 2001 From: Thomas Cardonne Date: Thu, 28 Mar 2024 23:36:15 +0100 Subject: [PATCH 004/136] fix(plugins/catalog-backend-module-github): support push events with catalogPath containing glob patterns Signed-off-by: Thomas Cardonne --- .changeset/pink-years-peel.md | 6 ++ .../providers/GithubEntityProvider.test.ts | 71 +++++++++++++++++++ .../src/providers/GithubEntityProvider.ts | 23 +++--- 3 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 .changeset/pink-years-peel.md diff --git a/.changeset/pink-years-peel.md b/.changeset/pink-years-peel.md new file mode 100644 index 0000000000..b2d44e2113 --- /dev/null +++ b/.changeset/pink-years-peel.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-backend-module-github': patch +--- + +GitHub push events now schedule a refresh on entities that have a refresh_key matching the `catalogPath` config itself. +This allows to support a `catalogPath` configuration that uses glob patterns. diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts index d0fc54245f..a201177198 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts @@ -1074,6 +1074,77 @@ describe('GithubEntityProvider', () => { expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(0); }); + it('apply refresh call on modified files from push event when catalogPath contains a glob pattern', async () => { + const schedule = new PersistingTaskRunner(); + const config = new ConfigReader({ + catalog: { + providers: { + github: { + organization: 'test-org', + catalogPath: '**/catalog-info.yaml', + }, + }, + }, + }); + + const provider = GithubEntityProvider.fromConfig(config, { + logger, + schedule, + })[0]; + + const entityProviderConnection: EntityProviderConnection = { + applyMutation: jest.fn(), + refresh: jest.fn(), + }; + await provider.connect(entityProviderConnection); + + const event: EventParams = { + topic: 'github.push', + metadata: { + 'x-github-event': 'push', + }, + eventPayload: { + ref: 'refs/heads/main', + repository: { + name: 'teste-1', + url: 'https://github.com/test-org/test-repo', + default_branch: 'main', + stargazers: 0, + master_branch: 'main', + organization: 'test-org', + topics: [], + }, + created: true, + deleted: false, + forced: false, + commits: [ + { + added: ['new-file.yaml'], + removed: [], + modified: [], + }, + { + added: [], + removed: [], + modified: ['catalog-info.yaml'], + }, + ], + }, + }; + + await provider.onEvent(event); + + expect(entityProviderConnection.refresh).toHaveBeenCalledTimes(1); + expect(entityProviderConnection.refresh).toHaveBeenCalledWith({ + keys: [ + 'url:https://github.com/test-org/test-repo/tree/main/catalog-info.yaml', + 'url:https://github.com/test-org/test-repo/blob/main/catalog-info.yaml', + 'url:https://github.com/test-org/test-repo/tree/main/**/catalog-info.yaml', + ], + }); + expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(0); + }); + it('should process repository when match filters from push event', async () => { const schedule = new PersistingTaskRunner(); const config = new ConfigReader({ diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts index 3c1e6c390b..b099a597b0 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts @@ -374,16 +374,23 @@ export class GithubEntityProvider implements EntityProvider, EventSubscriber { ); if (modified.length > 0) { + const catalogPath = this.config.catalogPath.startsWith('/') + ? this.config.catalogPath.substring(1) + : this.config.catalogPath; + await this.connection.refresh({ keys: [ - ...modified.map( - filePath => - `url:${event.repository.url}/tree/${branch}/${filePath}`, - ), - ...modified.map( - filePath => - `url:${event.repository.url}/blob/${branch}/${filePath}`, - ), + ...new Set([ + ...modified.map( + filePath => + `url:${event.repository.url}/tree/${branch}/${filePath}`, + ), + ...modified.map( + filePath => + `url:${event.repository.url}/blob/${branch}/${filePath}`, + ), + `url:${event.repository.url}/tree/${branch}/${catalogPath}`, + ]), ], }); } From ffcf9649f4135fe9e42dc3d3486c775fbb176fdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tan=20=F0=9F=94=A5?= Date: Tue, 9 Apr 2024 10:19:49 +0200 Subject: [PATCH 005/136] fix: OpenAPI table in dark mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tan 🔥 --- .../components/OpenApiDefinitionWidget/OpenApiDefinition.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx b/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx index ee23e75ff2..1505646dee 100644 --- a/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx +++ b/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx @@ -34,7 +34,9 @@ const useStyles = makeStyles(theme => ({ [`& .opblock-tag, .opblock-tag small, table thead tr td, - table thead tr th`]: { + table thead tr th, + table tbody tr td, + table tbody tr th`]: { fontFamily: theme.typography.fontFamily, color: theme.palette.text.primary, borderColor: theme.palette.divider, From 725ff0b9bade20e0605eb0f05708ed164980d2fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tan=20=F0=9F=94=A5?= Date: Tue, 9 Apr 2024 10:27:57 +0200 Subject: [PATCH 006/136] chore: add Changeset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tan 🔥 --- .changeset/quiet-boxes-build.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/quiet-boxes-build.md diff --git a/.changeset/quiet-boxes-build.md b/.changeset/quiet-boxes-build.md new file mode 100644 index 0000000000..c6c805435b --- /dev/null +++ b/.changeset/quiet-boxes-build.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-api-docs': minor +--- + +Fix dark mode text color inside tables in `description:` from OpenAPI definitions From 7da37564ef8584afdd296b8947c42b75c48920ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tania=20R=2E=20Z=C3=BA=C3=B1iga?= Date: Tue, 9 Apr 2024 11:29:23 +0200 Subject: [PATCH 007/136] Update .changeset/quiet-boxes-build.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ben Lambert Signed-off-by: Tania R. Zúñiga --- .changeset/quiet-boxes-build.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/quiet-boxes-build.md b/.changeset/quiet-boxes-build.md index c6c805435b..c6f802d5b0 100644 --- a/.changeset/quiet-boxes-build.md +++ b/.changeset/quiet-boxes-build.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-api-docs': minor +'@backstage/plugin-api-docs': patch --- Fix dark mode text color inside tables in `description:` from OpenAPI definitions From 0501243a575569e894c8e29949f91b6779fd8259 Mon Sep 17 00:00:00 2001 From: JeevaRamanathan Date: Tue, 9 Apr 2024 21:49:45 +0530 Subject: [PATCH 008/136] Enhance Accessibility: Add ARIA Attributes to SearchModal Component Signed-off-by: JeevaRamanathan --- .changeset/thirty-mangos-travel.md | 5 +++++ plugins/search/src/components/SearchModal/SearchModal.tsx | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .changeset/thirty-mangos-travel.md diff --git a/.changeset/thirty-mangos-travel.md b/.changeset/thirty-mangos-travel.md new file mode 100644 index 0000000000..2281cc06b6 --- /dev/null +++ b/.changeset/thirty-mangos-travel.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search': patch +--- + +Added `aria-label` attribute to DialogTitle element and set `aria-modal` attribute to `true` for improved accessibility in the search modal. diff --git a/plugins/search/src/components/SearchModal/SearchModal.tsx b/plugins/search/src/components/SearchModal/SearchModal.tsx index 814779fb45..07eec4438e 100644 --- a/plugins/search/src/components/SearchModal/SearchModal.tsx +++ b/plugins/search/src/components/SearchModal/SearchModal.tsx @@ -190,7 +190,8 @@ export const SearchModal = (props: SearchModalProps) => { paperFullWidth: classes.paperFullWidth, }} onClose={toggleModal} - aria-labelledby="search-modal-title" + aria-label="Search Modal" + aria-modal="true" fullWidth maxWidth="lg" open={open} From 6c317a74d3d720fd28923928a70a1d8d8c14787a Mon Sep 17 00:00:00 2001 From: Thomas Cardonne Date: Fri, 5 Apr 2024 18:09:09 +0200 Subject: [PATCH 009/136] Update pink-years-peel.md Signed-off-by: Thomas Cardonne --- .changeset/pink-years-peel.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/pink-years-peel.md b/.changeset/pink-years-peel.md index b2d44e2113..339889f27e 100644 --- a/.changeset/pink-years-peel.md +++ b/.changeset/pink-years-peel.md @@ -2,5 +2,5 @@ '@backstage/plugin-catalog-backend-module-github': patch --- -GitHub push events now schedule a refresh on entities that have a refresh_key matching the `catalogPath` config itself. +GitHub push events now schedule a refresh on entities that have a `refresh_key` matching the `catalogPath` config itself. This allows to support a `catalogPath` configuration that uses glob patterns. From 32da2b1954e360ffb083cbff3d6669878a2aaba9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 02:26:13 +0000 Subject: [PATCH 010/136] chore(deps): update dependency @types/tar to v6.1.13 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index ad5d48bd8f..4b093fd7f4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19770,12 +19770,12 @@ __metadata: linkType: hard "@types/tar@npm:^6.1.1": - version: 6.1.12 - resolution: "@types/tar@npm:6.1.12" + version: 6.1.13 + resolution: "@types/tar@npm:6.1.13" dependencies: "@types/node": "*" minipass: ^4.0.0 - checksum: b1cbae1894cc943e3a86f88613853986f97f552c6bec34ee990a47fe5905871d1552397ff440108233d75d05653be2fbc356e62beb0b93a45b927fb88060b438 + checksum: bb3910936a6b37f093e38b73a52b0544fd73079685f5ea72e5c049fddc3770e58d80cf6d714425853f0746290221852c1a7ca89ffdb9614f3b2a858a3bf5436a languageName: node linkType: hard From 5dc5f4f8ba7a7e7d4b1891ed9c2d9c7e6e131322 Mon Sep 17 00:00:00 2001 From: Phil Kuang Date: Wed, 3 Apr 2024 22:16:06 -0400 Subject: [PATCH 011/136] refactor(collators): allow tokenManager param to be optional Signed-off-by: Phil Kuang --- .changeset/wild-seahorses-grin.md | 6 ++++++ plugins/search-backend-module-catalog/api-report.md | 2 +- .../src/collators/DefaultCatalogCollatorFactory.ts | 4 +--- plugins/search-backend-module-techdocs/api-report.md | 2 +- .../src/collators/DefaultTechDocsCollatorFactory.ts | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 .changeset/wild-seahorses-grin.md diff --git a/.changeset/wild-seahorses-grin.md b/.changeset/wild-seahorses-grin.md new file mode 100644 index 0000000000..94b30a6839 --- /dev/null +++ b/.changeset/wild-seahorses-grin.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-search-backend-module-techdocs': patch +'@backstage/plugin-search-backend-module-catalog': patch +--- + +Allow the `tokenManager` parameter to be optional when instantiating collator diff --git a/plugins/search-backend-module-catalog/api-report.md b/plugins/search-backend-module-catalog/api-report.md index fc19ede2d4..8019ab0aac 100644 --- a/plugins/search-backend-module-catalog/api-report.md +++ b/plugins/search-backend-module-catalog/api-report.md @@ -44,7 +44,7 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { export type DefaultCatalogCollatorFactoryOptions = { auth?: AuthService; discovery: PluginEndpointDiscovery; - tokenManager: TokenManager; + tokenManager?: TokenManager; locationTemplate?: string; filter?: GetEntitiesRequest['filter']; batchSize?: number; diff --git a/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts b/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts index 166985f2d5..22dcc67233 100644 --- a/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts +++ b/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts @@ -40,7 +40,7 @@ import { AuthService } from '@backstage/backend-plugin-api'; export type DefaultCatalogCollatorFactoryOptions = { auth?: AuthService; discovery: PluginEndpointDiscovery; - tokenManager: TokenManager; + tokenManager?: TokenManager; /** * @deprecated Use the config key `search.collators.catalog.locationTemplate` instead. */ @@ -95,7 +95,6 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { entityTransformer: options.entityTransformer, auth: adaptedAuth, discovery: options.discovery, - tokenManager: options.tokenManager, catalogClient: options.catalogClient, }); } @@ -107,7 +106,6 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory { entityTransformer?: CatalogCollatorEntityTransformer; auth: AuthService; discovery: PluginEndpointDiscovery; - tokenManager: TokenManager; catalogClient?: CatalogApi; }) { const { diff --git a/plugins/search-backend-module-techdocs/api-report.md b/plugins/search-backend-module-techdocs/api-report.md index fbdecef2a8..35cf8533cf 100644 --- a/plugins/search-backend-module-techdocs/api-report.md +++ b/plugins/search-backend-module-techdocs/api-report.md @@ -45,7 +45,7 @@ export type TechDocsCollatorEntityTransformer = ( export type TechDocsCollatorFactoryOptions = { discovery: PluginEndpointDiscovery; logger: LoggerService; - tokenManager: TokenManager; + tokenManager?: TokenManager; auth?: AuthService; httpAuth?: HttpAuthService; locationTemplate?: string; diff --git a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts index ad820e6ad2..10c09d02b2 100644 --- a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts +++ b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts @@ -61,7 +61,7 @@ interface MkSearchIndexDoc { export type TechDocsCollatorFactoryOptions = { discovery: PluginEndpointDiscovery; logger: LoggerService; - tokenManager: TokenManager; + tokenManager?: TokenManager; auth?: AuthService; httpAuth?: HttpAuthService; locationTemplate?: string; From a2ee4df20a6884d00328556948c81448d1487dd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustaf=20R=C3=A4ntil=C3=A4?= Date: Fri, 22 Mar 2024 08:46:49 +0100 Subject: [PATCH 012/136] feat: Allow GaugeCard to handle multi-line titles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By adding a fullHeightFixedContent variant. Also, add support for a small version. Signed-off-by: Gustaf Räntilä --- .changeset/selfish-walls-visit.md | 5 ++ packages/core-components/api-report.md | 7 +- .../src/components/ProgressBars/Gauge.tsx | 14 +++- .../ProgressBars/GaugeCard.stories.tsx | 76 +++++++++++++++++++ .../src/components/ProgressBars/GaugeCard.tsx | 17 ++++- .../src/layout/InfoCard/InfoCard.tsx | 25 +++++- 6 files changed, 137 insertions(+), 7 deletions(-) create mode 100644 .changeset/selfish-walls-visit.md diff --git a/.changeset/selfish-walls-visit.md b/.changeset/selfish-walls-visit.md new file mode 100644 index 0000000000..8748b3717e --- /dev/null +++ b/.changeset/selfish-walls-visit.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Add a fullHeightFixedContent variant of the GaugeCard, and a small size version. Fixed content will vertically align the gauge in the cards, even when the card titles span across multiple lines. diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index 7fd706db43..1e5c1b892f 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -448,6 +448,7 @@ export type GaugeProps = { inverse?: boolean; unit?: string; max?: number; + size?: 'normal' | 'small'; description?: ReactNode; getColor?: GaugePropsGetColor; }; @@ -609,7 +610,11 @@ export type InfoCardClassKey = | 'headerContent'; // @public (undocumented) -export type InfoCardVariants = 'flex' | 'fullHeight' | 'gridItem'; +export type InfoCardVariants = + | 'flex' + | 'fullHeight' + | 'fullHeightFixedContent' + | 'gridItem'; // Warning: (ae-forgotten-export) The symbol "ItemCardProps" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "ItemCard" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) diff --git a/packages/core-components/src/components/ProgressBars/Gauge.tsx b/packages/core-components/src/components/ProgressBars/Gauge.tsx index 088e369e62..87d2bf4f58 100644 --- a/packages/core-components/src/components/ProgressBars/Gauge.tsx +++ b/packages/core-components/src/components/ProgressBars/Gauge.tsx @@ -19,6 +19,7 @@ import { makeStyles, useTheme } from '@material-ui/core/styles'; import { Circle } from 'rc-progress'; import React, { ReactNode, useEffect, useState } from 'react'; import Box from '@material-ui/core/Box'; +import classNames from 'classnames'; /** @public */ export type GaugeClassKey = @@ -43,6 +44,9 @@ const useStyles = makeStyles( fontWeight: theme.typography.fontWeightBold, color: theme.palette.textContrast, }, + overlaySmall: { + fontSize: theme.typography.pxToRem(25), + }, description: { fontSize: '100%', top: '50%', @@ -68,6 +72,7 @@ export type GaugeProps = { inverse?: boolean; unit?: string; max?: number; + size?: 'normal' | 'small'; description?: ReactNode; getColor?: GaugePropsGetColor; }; @@ -121,7 +126,7 @@ export const getProgressColor: GaugePropsGetColor = ({ export function Gauge(props: GaugeProps) { const [hoverRef, setHoverRef] = useState(null); - const { getColor = getProgressColor } = props; + const { getColor = getProgressColor, size = 'normal' } = props; const classes = useStyles(props); const { palette } = useTheme(); const { value, fractional, inverse, unit, max, description } = { @@ -165,7 +170,12 @@ export function Gauge(props: GaugeProps) { {description && isHovering ? ( {description} ) : ( - + {isNaN(value) ? 'N/A' : `${asActual}${unit}`} )} diff --git a/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx b/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx index a0b6faea60..21d023999e 100644 --- a/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx +++ b/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx @@ -175,6 +175,82 @@ export const InfoMessage = () => ( ); +export const AlignedBottom = () => ( + + + + + + + + + + + + + + +); + +export const Small = () => ( + + + + + + + + + + + + + + +); + export const HoverMessage = () => ( diff --git a/packages/core-components/src/components/ProgressBars/GaugeCard.tsx b/packages/core-components/src/components/ProgressBars/GaugeCard.tsx index 3442395380..bbb870141b 100644 --- a/packages/core-components/src/components/ProgressBars/GaugeCard.tsx +++ b/packages/core-components/src/components/ProgressBars/GaugeCard.tsx @@ -27,6 +27,7 @@ type Props = { variant?: InfoCardVariants; /** Progress in % specified as decimal, e.g. "0.23" */ progress: number; + size?: 'normal' | 'small'; description?: ReactNode; icon?: ReactNode; inverse?: boolean; @@ -43,6 +44,10 @@ const useStyles = makeStyles( height: '100%', width: 250, }, + rootSmall: { + height: '100%', + width: 160, + }, }, { name: 'BackstageGaugeCard' }, ); @@ -64,6 +69,7 @@ export function GaugeCard(props: Props) { description, icon, variant, + size = 'normal', getColor, } = props; @@ -75,15 +81,22 @@ export function GaugeCard(props: Props) { }; return ( - + - + ); diff --git a/packages/core-components/src/layout/InfoCard/InfoCard.tsx b/packages/core-components/src/layout/InfoCard/InfoCard.tsx index c80e71b609..9fd72e50b6 100644 --- a/packages/core-components/src/layout/InfoCard/InfoCard.tsx +++ b/packages/core-components/src/layout/InfoCard/InfoCard.tsx @@ -46,6 +46,10 @@ const useStyles = makeStyles( header: { padding: theme.spacing(2, 2, 2, 2.5), }, + headerFixedContent: { + flexGrow: 1, + alignItems: 'flex-start', + }, headerTitle: { fontWeight: theme.typography.fontWeightBold, }, @@ -87,6 +91,11 @@ const VARIANT_STYLES = { flexDirection: 'column', height: '100%', }, + fullHeightFixedContent: { + display: 'flex', + flexDirection: 'column', + height: '100%', + }, gridItem: { display: 'flex', flexDirection: 'column', @@ -102,6 +111,9 @@ const VARIANT_STYLES = { fullHeight: { flex: 1, }, + fullHeightFixedContent: { + flex: '0 1 0%', + }, gridItem: { flex: 1, }, @@ -109,7 +121,11 @@ const VARIANT_STYLES = { }; /** @public */ -export type InfoCardVariants = 'flex' | 'fullHeight' | 'gridItem'; +export type InfoCardVariants = + | 'flex' + | 'fullHeight' + | 'fullHeightFixedContent' + | 'gridItem'; /** * InfoCard is used to display a paper-styled block on the screen, similar to a panel. @@ -228,7 +244,12 @@ export function InfoCard(props: Props): JSX.Element { {title && ( Date: Fri, 22 Mar 2024 16:09:05 +0100 Subject: [PATCH 013/136] Changed to not having a fixed/full sized header, but allow the content to grow, with an option to align the content to the bottom MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gustaf Räntilä --- .changeset/selfish-walls-visit.md | 3 +- packages/core-components/api-report.md | 6 +--- .../ProgressBars/GaugeCard.stories.tsx | 24 +++++++++----- .../src/components/ProgressBars/GaugeCard.tsx | 3 ++ .../src/layout/InfoCard/InfoCard.tsx | 32 ++++++------------- 5 files changed, 31 insertions(+), 37 deletions(-) diff --git a/.changeset/selfish-walls-visit.md b/.changeset/selfish-walls-visit.md index 8748b3717e..64c87a64f5 100644 --- a/.changeset/selfish-walls-visit.md +++ b/.changeset/selfish-walls-visit.md @@ -2,4 +2,5 @@ '@backstage/core-components': patch --- -Add a fullHeightFixedContent variant of the GaugeCard, and a small size version. Fixed content will vertically align the gauge in the cards, even when the card titles span across multiple lines. +Add `alignGauge` prop to the `GaugeCard`, and a small size version. When `alignGauge` is `'bottom'` the gauge will vertically align the gauge in the cards, even when the card titles span across multiple lines. +Add `alignContent` prop to the `InfoCard`, defaulting to `'normal'` with the option of `'bottom'` which vertically aligns the content to the bottom of the card. diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index 1e5c1b892f..293695db0c 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -610,11 +610,7 @@ export type InfoCardClassKey = | 'headerContent'; // @public (undocumented) -export type InfoCardVariants = - | 'flex' - | 'fullHeight' - | 'fullHeightFixedContent' - | 'gridItem'; +export type InfoCardVariants = 'flex' | 'fullHeight' | 'gridItem'; // Warning: (ae-forgotten-export) The symbol "ItemCardProps" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "ItemCard" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) diff --git a/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx b/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx index 21d023999e..12cdef52cb 100644 --- a/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx +++ b/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx @@ -179,7 +179,8 @@ export const AlignedBottom = () => ( ( ( ( ( ( ( ( From 0b9d63a02519628a5a3546376451b6dc3ff33966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustaf=20R=C3=A4ntil=C3=A4?= Date: Sat, 6 Apr 2024 08:55:14 +0200 Subject: [PATCH 014/136] fix: Minor refactoring of styling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gustaf Räntilä --- .../core-components/src/components/ProgressBars/Gauge.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/core-components/src/components/ProgressBars/Gauge.tsx b/packages/core-components/src/components/ProgressBars/Gauge.tsx index 87d2bf4f58..e72172fd59 100644 --- a/packages/core-components/src/components/ProgressBars/Gauge.tsx +++ b/packages/core-components/src/components/ProgressBars/Gauge.tsx @@ -171,10 +171,9 @@ export function Gauge(props: GaugeProps) { {description} ) : ( {isNaN(value) ? 'N/A' : `${asActual}${unit}`} From a7648561962ac8d80c1145aa3b4e488e3063d427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustaf=20R=C3=A4ntil=C3=A4?= Date: Sat, 6 Apr 2024 09:28:13 +0200 Subject: [PATCH 015/136] feat: Added subheaderTypographyProps prop to InfoCard, allowing it to be used from GaugeCard. Also made GaugeCard 'small' variant to have smaller text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gustaf Räntilä --- .../components/ProgressBars/GaugeCard.stories.tsx | 1 + .../src/components/ProgressBars/GaugeCard.tsx | 13 ++++++------- .../src/layout/InfoCard/InfoCard.tsx | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx b/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx index 12cdef52cb..f7e2eb69c6 100644 --- a/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx +++ b/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx @@ -234,6 +234,7 @@ export const Small = () => ( alignGauge="bottom" size="small" title="Progress" + subheader="With a subheader" progress={0.57} /> diff --git a/packages/core-components/src/components/ProgressBars/GaugeCard.tsx b/packages/core-components/src/components/ProgressBars/GaugeCard.tsx index 4e73487983..9f6de8eafe 100644 --- a/packages/core-components/src/components/ProgressBars/GaugeCard.tsx +++ b/packages/core-components/src/components/ProgressBars/GaugeCard.tsx @@ -91,13 +91,12 @@ export function GaugeCard(props: Props) { variant={variant} alignContent={alignGauge} icon={icon} - titleTypographyProps={ - size === 'small' - ? { - variant: 'h6', - } - : undefined - } + titleTypographyProps={{ + ...(size === 'small' ? { variant: 'subtitle2' } : undefined), + }} + subheaderTypographyProps={{ + ...(size === 'small' ? { variant: 'body2' } : undefined), + }} > diff --git a/packages/core-components/src/layout/InfoCard/InfoCard.tsx b/packages/core-components/src/layout/InfoCard/InfoCard.tsx index 1f41a315b8..e80c0d3384 100644 --- a/packages/core-components/src/layout/InfoCard/InfoCard.tsx +++ b/packages/core-components/src/layout/InfoCard/InfoCard.tsx @@ -155,6 +155,7 @@ export type Props = { className?: string; noPadding?: boolean; titleTypographyProps?: object; + subheaderTypographyProps?: object; }; /** @@ -185,6 +186,7 @@ export function InfoCard(props: Props): JSX.Element { className, noPadding, titleTypographyProps, + subheaderTypographyProps, } = props; const classes = useStyles(); /** @@ -246,6 +248,7 @@ export function InfoCard(props: Props): JSX.Element { action={action} style={{ ...headerStyle }} titleTypographyProps={titleTypographyProps} + subheaderTypographyProps={subheaderTypographyProps} {...headerProps} /> )} From f72f3a076dd911a2f836b5a8b534e6e0fbe0c885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustaf=20R=C3=A4ntil=C3=A4?= Date: Sat, 6 Apr 2024 09:32:23 +0200 Subject: [PATCH 016/136] fix: Made the subhead in InfoCard not duplicate top padding props twice MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gustaf Räntilä --- packages/core-components/src/layout/InfoCard/InfoCard.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/core-components/src/layout/InfoCard/InfoCard.tsx b/packages/core-components/src/layout/InfoCard/InfoCard.tsx index e80c0d3384..a08a816c2e 100644 --- a/packages/core-components/src/layout/InfoCard/InfoCard.tsx +++ b/packages/core-components/src/layout/InfoCard/InfoCard.tsx @@ -217,10 +217,7 @@ export function InfoCard(props: Props): JSX.Element { } return ( -
+
{subheader &&
{subheader}
} {icon}
From 8de182a42ae62132e05805c89ed6c9f176c6eff1 Mon Sep 17 00:00:00 2001 From: cmoulliard Date: Mon, 22 Apr 2024 17:20:47 +0200 Subject: [PATCH 017/136] WIP. Add custom filters doc section Signed-off-by: cmoulliard --- .../software-templates/writing-templates.md | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index ad542ba4a3..0f5c10b96d 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -654,6 +654,8 @@ how to use them in the Scaffolder templates. It's important to mention that Back native filters from the Nunjucks library. For a complete list of these native filters and their usage, refer to the [Nunjucks documentation](https://mozilla.github.io/nunjucks/templating.html#builtin-filters). +To create your own custom filters, look to the section [Custom Filters](#custom-filters) hereafter. + ### parseRepoUrl The `parseRepoUrl` filter parse a repository URL into @@ -738,3 +740,26 @@ The `projectSlug` filter generates a project slug from a repository URL - **Input**: `github.com?repo=backstage&org=backstage` - **Output**: `backstage/backstage` + +## Custom Filters + +Whenever it is needed to extend the built-in filters with yours `${{ parameters.name | my-filter1 | my-filter2 | etc }}`, then you have the option to add them using the property `addTemplateFilters` of the type `RouterOptions` that you typically define + +```ts title="plugins/scaffolder-backend/src/service/router.ts" +export interface RouterOptions { + ... + additionalTemplateFilters?: Record; +} +``` + +The `addTemplateFilters` function accepts the filters as a JSON array of records where each record starts +with the name of the filter, get as input a list of `JSON value` arguments and will return a JsonValue. + +```ts title="plugins/scaffolder-node/stc/types.ts" +export type TemplateFilter = (...args: JsonValue[]) => JsonValue | undefined; +``` + +OR + +function of the `ScaffolderTemplatingExtensionPoint` interface +addTemplateFilters(filters: Record): void; From 6c58521e5b8974941df7605a9c7da9327be47afd Mon Sep 17 00:00:00 2001 From: cmoulliard Date: Mon, 22 Apr 2024 18:10:21 +0200 Subject: [PATCH 018/136] Review the section custom filter and fix vale error Signed-off-by: cmoulliard --- .../software-templates/writing-templates.md | 73 ++++++++++++++++--- 1 file changed, 62 insertions(+), 11 deletions(-) diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index 0f5c10b96d..0b5f8c4948 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -743,23 +743,74 @@ The `projectSlug` filter generates a project slug from a repository URL ## Custom Filters -Whenever it is needed to extend the built-in filters with yours `${{ parameters.name | my-filter1 | my-filter2 | etc }}`, then you have the option to add them using the property `addTemplateFilters` of the type `RouterOptions` that you typically define +Whenever it is needed to extend the built-in filters with yours `${{ parameters.name | my-filter1 | my-filter2 | etc }}`, then you can add them +using the property `addTemplateFilters` that you typically define using the `createRouter()` function of the `Scaffolder plugin` -```ts title="plugins/scaffolder-backend/src/service/router.ts" -export interface RouterOptions { +```ts title="packages/backend/src/plugins/scaffolder.ts" +export default async function createPlugin({ + logger, + config, +}: PluginEnvironment): Promise { ... - additionalTemplateFilters?: Record; -} + return await createRouter({ + logger, + config, + + additionalTemplateFilters: { + + } + }); ``` -The `addTemplateFilters` function accepts the filters as a JSON array of records where each record starts -with the name of the filter, get as input a list of `JSON value` arguments and will return a JsonValue. +The `addTemplateFilters` property accepts a `Record` -```ts title="plugins/scaffolder-node/stc/types.ts" +```ts title="plugins/scaffolder-backend/src/service/Router.ts" + additionalTemplateFilters?: Record; +``` + +where the first parameter is the name of the filter and the second `TemplateFilter` receives a list of `JSON value` arguments. The `templateFilter()` function should return a JsonValue (Json array, object or primitive). + +```ts title="plugins/scaffolder-node/src/types.ts" export type TemplateFilter = (...args: JsonValue[]) => JsonValue | undefined; ``` -OR +From a practical coding point of view, you will translate that into the following snippet code -function of the `ScaffolderTemplatingExtensionPoint` interface -addTemplateFilters(filters: Record): void; +```ts title="packages/backend/src/plugins/scaffolder.ts" +... + return await createRouter({ + logger: env.logger, + config: env.config, + additionalTemplateFilters: { + base64: (...args: JsonValue[]) => btoa(args.join("")), + betterFilter: (...args: JsonValue[]) => { return `This is a much better string than "${args}", don't you think?` } + }, +}); +``` + +And within your template, you will be able to use the filters like this + +```yaml +apiVersion: scaffolder.backstage.io/v1beta3 +kind: Template +metadata: + name: test + title: Test +spec: + owner: user:guest + type: service + + parameters: + - title: Test custom filters + properties: + userName: + title: Name of the user + type: string + + steps: + - id: debug + name: debug + action: debug:log + input: + message: ${{ parameters.userName | betterFilter | base64 }} +``` From 6200d6204bc471fa49d8c826ca469bdb7586c453 Mon Sep 17 00:00:00 2001 From: cmoulliard Date: Mon, 22 Apr 2024 18:11:07 +0200 Subject: [PATCH 019/136] Change should to switch. #24002 Signed-off-by: cmoulliard --- docs/features/software-templates/writing-templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index 0b5f8c4948..4b169a0714 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -768,7 +768,7 @@ The `addTemplateFilters` property accepts a `Record` additionalTemplateFilters?: Record; ``` -where the first parameter is the name of the filter and the second `TemplateFilter` receives a list of `JSON value` arguments. The `templateFilter()` function should return a JsonValue (Json array, object or primitive). +where the first parameter is the name of the filter and the second `TemplateFilter` receives a list of `JSON value` arguments. The `templateFilter()` function must return a JsonValue (Json array, object or primitive). ```ts title="plugins/scaffolder-node/src/types.ts" export type TemplateFilter = (...args: JsonValue[]) => JsonValue | undefined; From b10a8cb578d3821920133b7c6ecf68d5e43ddd12 Mon Sep 17 00:00:00 2001 From: cmoulliard Date: Mon, 22 Apr 2024 18:36:24 +0200 Subject: [PATCH 020/136] Include the section covering: Register Custom Filters with the New Backend System Signed-off-by: cmoulliard --- .../software-templates/writing-templates.md | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index 4b169a0714..766a58d01b 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -814,3 +814,44 @@ spec: input: message: ${{ parameters.userName | betterFilter | base64 }} ``` + +### Register Custom Filters with the New Backend System + +To register the custom filters using the new Backend System, you will have to create a [backend module](../../backend-system/architecture/06-modules.md) calling following extension point: `scaffolderTemplatingExtensionPoint`. + +Here is a very simplified example of how to do that: + +```ts title="packages/backend/src/index.ts" +/* highlight-add-start */ +import { scaffolderTemplatingExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { createBackendModule } from '@backstage/backend-plugin-api'; +/* highlight-add-end */ + +/* highlight-add-start */ +const scaffolderModuleCustomFilters = createBackendModule({ + pluginId: 'scaffolder', // name of the plugin that the module is targeting + moduleId: 'custom-filters', + register(env) { + env.registerInit({ + deps: { + scaffolder: scaffolderTemplatingExtensionPoint, + // ... and other dependencies as needed + }, + async init({ scaffolder /* ..., other dependencies */ }) { + scaffolder.addTemplateFilters({ + base64: (...args: JsonValue[]) => btoa(args.join('')), + betterFilter: (...args: JsonValue[]) => { + return `This is a much better string than "${args}", don't you think?`; + }, + }); + }, + }); + }, +}); +/* highlight-add-end */ + +const backend = createBackend(); +backend.add(import('@backstage/plugin-scaffolder-backend/alpha')); +/* highlight-add-next-line */ +backend.add(scaffolderModuleCustomFilters()); +``` From 18f736ffc5efbd2e2dcdf08c12fa8c14ca883791 Mon Sep 17 00:00:00 2001 From: JeevaRamanathan Date: Sat, 27 Apr 2024 22:22:06 +0530 Subject: [PATCH 021/136] Add examples for scaffolder action & improve related tests Signed-off-by: JeevaRamanathan --- .changeset/tame-jars-double.md | 5 + ...tlabProjectVariableAction.examples.test.ts | 236 ++++++++++++++++++ ...ateGitlabProjectVariableAction.examples.ts | 160 ++++++++++++ .../createGitlabProjectVariableAction.ts | 3 +- 4 files changed, 403 insertions(+), 1 deletion(-) create mode 100644 .changeset/tame-jars-double.md create mode 100644 plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.test.ts create mode 100644 plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.ts diff --git a/.changeset/tame-jars-double.md b/.changeset/tame-jars-double.md new file mode 100644 index 0000000000..8af92a2d72 --- /dev/null +++ b/.changeset/tame-jars-double.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-gitlab': minor +--- + +Add examples for `gitlab:projectVariable:create` scaffolder action & improve related tests diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.test.ts new file mode 100644 index 0000000000..d1c37ccd9d --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.test.ts @@ -0,0 +1,236 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createGitlabProjectVariableAction } from './createGitlabProjectVariableAction'; +import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils'; +import { ScmIntegrations } from '@backstage/integration'; +import { ConfigReader } from '@backstage/config'; +import yaml from 'yaml'; +import { examples } from './createGitlabProjectVariableAction.examples'; + +const mockGitlabClient = { + ProjectVariables: { + create: jest.fn(), + }, +}; +jest.mock('@gitbeaker/node', () => ({ + Gitlab: class { + constructor() { + return mockGitlabClient; + } + }, +})); + +describe('gitlab:projectVariableAction: create examples', () => { + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'gitlab.com', + token: 'tokenlols', + apiBaseUrl: 'https://api.gitlab.com', + }, + { + host: 'hosted.gitlab.com', + apiBaseUrl: 'https://api.hosted.gitlab.com', + }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + const action = createGitlabProjectVariableAction({ integrations }); + const mockContext = createMockActionContext({ + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + projectId: '123', + key: 'MY_VARIABLE', + value: 'my_value', + variableType: 'env_var', + }, + }); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it(`Should ${examples[0].description}`, async () => { + mockGitlabClient.ProjectVariables.create.mockResolvedValue({ + token: 'TOKEN', + }); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[0].example).steps[0].input, + }); + + expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith( + '123', + { + key: 'MY_VARIABLE', + value: 'my_value', + variable_type: 'env_var', + environment_scope: '*', + masked: false, + protected: false, + raw: false, + }, + ); + }); + it(`Should ${examples[1].description}`, async () => { + mockGitlabClient.ProjectVariables.create.mockResolvedValue({ + token: 'TOKEN', + }); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[1].example).steps[0].input, + }); + + expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith( + '123', + { + key: 'MY_VARIABLE', + value: 'my-file-content', + protected: false, + masked: false, + raw: false, + environment_scope: '*', + variable_type: 'file', + }, + ); + }); + + it(`Should ${examples[2].description}`, async () => { + mockGitlabClient.ProjectVariables.create.mockResolvedValue({ + token: 'TOKEN', + }); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[2].example).steps[0].input, + }); + + expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith( + '456', + { + key: 'MY_VARIABLE', + value: 'my_value', + masked: false, + raw: false, + environment_scope: '*', + variable_type: 'env_var', + protected: true, + }, + ); + }); + + it(`Should ${examples[3].description}`, async () => { + mockGitlabClient.ProjectVariables.create.mockResolvedValue({ + token: 'TOKEN', + }); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[3].example).steps[0].input, + }); + + expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith( + '789', + { + key: 'DB_PASSWORD', + value: 'password123', + protected: false, + raw: false, + environment_scope: '*', + variable_type: 'env_var', + masked: true, + }, + ); + }); + + it(`Should ${examples[4].description}`, async () => { + mockGitlabClient.ProjectVariables.create.mockResolvedValue({ + token: 'TOKEN', + }); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[4].example).steps[0].input, + }); + + expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith( + '123', + { + key: 'MY_VARIABLE', + value: 'my_value', + protected: false, + environment_scope: '*', + variable_type: 'env_var', + masked: false, + raw: true, + }, + ); + }); + + it(`Should ${examples[5].description}`, async () => { + mockGitlabClient.ProjectVariables.create.mockResolvedValue({ + token: 'TOKEN', + }); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[5].example).steps[0].input, + }); + + expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith( + '123', + { + key: 'MY_VARIABLE', + value: 'my_value', + protected: false, + variable_type: 'env_var', + masked: false, + raw: false, + environment_scope: 'production', + }, + ); + }); + + it(`Should ${examples[6].description}`, async () => { + mockGitlabClient.ProjectVariables.create.mockResolvedValue({ + token: 'TOKEN', + }); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[6].example).steps[0].input, + }); + + expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith( + '123', + { + key: 'MY_VARIABLE', + value: 'my_value', + protected: false, + variable_type: 'env_var', + masked: false, + raw: false, + environment_scope: '*', + }, + ); + }); +}); diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.ts new file mode 100644 index 0000000000..81d526f7c8 --- /dev/null +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.ts @@ -0,0 +1,160 @@ +/* + * 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 { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; + +export const examples: TemplateExample[] = [ + { + description: 'Creating a GitLab project variable of type env_var', + example: yaml.stringify({ + steps: [ + { + id: 'createVariable', + action: 'gitlab:createGitlabProjectVariableAction', + name: 'Create GitLab Project Variable', + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + projectId: '123', + key: 'MY_VARIABLE', + value: 'my_value', + variableType: 'env_var', + }, + }, + ], + }), + }, + { + description: 'Creating a GitLab project variable of type file', + example: yaml.stringify({ + steps: [ + { + id: 'createVariable', + action: 'gitlab:createGitlabProjectVariableAction', + name: 'Create GitLab Project Variable', + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + projectId: '123', + key: 'MY_VARIABLE', + value: 'my-file-content', + variableType: 'file', + }, + }, + ], + }), + }, + { + description: 'Create a GitLab project variable that is protected.', + example: yaml.stringify({ + steps: [ + { + id: 'createVariable', + action: 'gitlab:createGitlabProjectVariableAction', + name: 'Create GitLab Project Variable', + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + projectId: '456', + key: 'MY_VARIABLE', + value: 'my_value', + variableType: 'env_var', + variableProtected: true, + }, + }, + ], + }), + }, + { + description: 'Create a GitLab project variable with masked flag as true', + example: yaml.stringify({ + steps: [ + { + id: 'createVariable', + action: 'gitlab:createGitlabProjectVariableAction', + name: 'Create GitLab Project Variable', + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + projectId: '789', + key: 'DB_PASSWORD', + value: 'password123', + variableType: 'env_var', + masked: true, + }, + }, + ], + }), + }, + { + description: 'Create a GitLab project variable that is expandable.', + example: yaml.stringify({ + steps: [ + { + id: 'createVariable', + action: 'gitlab:projectVariable:create', + name: 'Create GitLab Project Variable', + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + projectId: '123', + key: 'MY_VARIABLE', + value: 'my_value', + variableType: 'env_var', + raw: true, + }, + }, + ], + }), + }, + { + description: + 'Create a GitLab project variable with a specific environment scope.', + example: yaml.stringify({ + steps: [ + { + id: 'createVariable', + action: 'gitlab:projectVariable:create', + name: 'Create GitLab Project Variable', + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + projectId: '123', + key: 'MY_VARIABLE', + value: 'my_value', + variableType: 'env_var', + environmentScope: 'production', + }, + }, + ], + }), + }, + { + description: + 'Create a GitLab project variable with a wildcard environment scope.', + example: yaml.stringify({ + steps: [ + { + id: 'createVariable', + action: 'gitlab:projectVariable:create', + name: 'Create GitLab Project Variable', + input: { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + projectId: '123', + key: 'MY_VARIABLE', + value: 'my_value', + variableType: 'env_var', + environmentScope: '*', + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.ts index a154c16662..e09a074701 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.ts @@ -20,6 +20,7 @@ import { Gitlab } from '@gitbeaker/node'; import { getToken } from '../util'; import commonGitlabConfig from '../commonGitlabConfig'; import { z } from 'zod'; +import { examples } from './createGitlabProjectVariableAction.examples'; /** * Creates a `gitlab:projectVariable:create` Scaffolder action. @@ -33,6 +34,7 @@ export const createGitlabProjectVariableAction = (options: { const { integrations } = options; return createTemplateAction({ id: 'gitlab:projectVariable:create', + examples, schema: { input: commonGitlabConfig.merge( z.object({ @@ -85,7 +87,6 @@ export const createGitlabProjectVariableAction = (options: { host: integrationConfig.config.baseUrl, token: token, }); - await api.ProjectVariables.create(projectId, { key: key, value: value, From 2cc750d36766a43c277760af681a28e373867243 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Fri, 19 Apr 2024 00:55:19 -0600 Subject: [PATCH 022/136] feat: integration support for harness Signed-off-by: Calvin Lee --- .changeset/empty-beers-relax.md | 5 + .changeset/tasty-rats-explain.md | 5 + .../config/vocabularies/Backstage/accept.txt | 2 + docs/integrations/harness/locations.md | 33 +++ microsite/sidebars.json | 5 + packages/backend-common/api-report.md | 26 +++ .../src/reading/HarnessCodeUrlReader.test.ts | 204 ++++++++++++++++++ .../src/reading/HarnessUrlReader.ts | 124 +++++++++++ .../backend-common/src/reading/UrlReaders.ts | 3 +- packages/backend-common/src/reading/index.ts | 1 + packages/integration/api-report.md | 55 ++++- packages/integration/config.d.ts | 24 +++ .../integration/src/ScmIntegrations.test.ts | 9 + packages/integration/src/ScmIntegrations.ts | 7 + .../src/harness/HarnessIntegration.test.ts | 128 +++++++++++ .../src/harness/HarnessIntegration.ts | 58 +++++ .../integration/src/harness/config.test.ts | 108 ++++++++++ packages/integration/src/harness/config.ts | 78 +++++++ packages/integration/src/harness/core.test.ts | 95 ++++++++ packages/integration/src/harness/core.ts | 135 ++++++++++++ packages/integration/src/harness/index.ts | 19 ++ packages/integration/src/index.ts | 1 + packages/integration/src/registry.ts | 2 + 23 files changed, 1125 insertions(+), 2 deletions(-) create mode 100644 .changeset/empty-beers-relax.md create mode 100644 .changeset/tasty-rats-explain.md create mode 100644 docs/integrations/harness/locations.md create mode 100644 packages/backend-common/src/reading/HarnessCodeUrlReader.test.ts create mode 100644 packages/backend-common/src/reading/HarnessUrlReader.ts create mode 100644 packages/integration/src/harness/HarnessIntegration.test.ts create mode 100644 packages/integration/src/harness/HarnessIntegration.ts create mode 100644 packages/integration/src/harness/config.test.ts create mode 100644 packages/integration/src/harness/config.ts create mode 100644 packages/integration/src/harness/core.test.ts create mode 100644 packages/integration/src/harness/core.ts create mode 100644 packages/integration/src/harness/index.ts diff --git a/.changeset/empty-beers-relax.md b/.changeset/empty-beers-relax.md new file mode 100644 index 0000000000..526f88c1c7 --- /dev/null +++ b/.changeset/empty-beers-relax.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +This patch adds HarnessURLReader to the available classes. It currently only reads single files via Harness codes public repo api. diff --git a/.changeset/tasty-rats-explain.md b/.changeset/tasty-rats-explain.md new file mode 100644 index 0000000000..aee8057915 --- /dev/null +++ b/.changeset/tasty-rats-explain.md @@ -0,0 +1,5 @@ +--- +'@backstage/integration': minor +--- + +This patch brings Harness Code as a valid integration via the ScmIntgration interface. It adds harness code to the relevant static properties ( get integration by name, get integration by type) for plugs to be able to reference the same harness code server diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt index 026e5a9b18..2e42ff7998 100644 --- a/.github/vale/config/vocabularies/Backstage/accept.txt +++ b/.github/vale/config/vocabularies/Backstage/accept.txt @@ -152,6 +152,8 @@ graphviz Hackathons haproxy hardcoded +Harness +harness Helidon Henneke Heroku diff --git a/docs/integrations/harness/locations.md b/docs/integrations/harness/locations.md new file mode 100644 index 0000000000..8911d7918c --- /dev/null +++ b/docs/integrations/harness/locations.md @@ -0,0 +1,33 @@ +--- +id: locations +title: Harness Locations +sidebar_label: Locations +description: Integrating source code stored in Harness Code into the Backstage catalog +--- + +The Harness Code integration supports loading catalog entities from a hosted repository. Entities can be added to +[static catalog configuration](../../features/software-catalog/configuration.md), +registered with the +[catalog-import](https://github.com/backstage/backstage/tree/master/plugins/catalog-import) +plugin. + +## Configuration + +To use this integration, add configuration to your root `app-config.yaml`: + +```yaml +integrations: + harness: + - host: app.harness.io + token: ${HARNESS_CODE_BEARER_TOKEN} +``` + +Directly under the `harnessCode` key is a list of provider configurations, where you +can list the Gitea instances you want to be able to fetch +data from. Each entry is a structure with up to four elements: + +- `host`: The host of the Harness Code instance that you want to match on. +- `baseUrl` (optional): Needed if the Harness Code instance is not reachable at + the base of the `host` option (e.g. `https://app.harness.io`). This is the address that you would open in a browser. +- `username` (optional): The gitea username to use in API requests. +- `token` (optional): The password or api token to authenticate with. diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 32863c61db..8291549153 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -238,6 +238,11 @@ "label": "Gitea", "items": ["integrations/gitea/locations"] }, + { + "type": "subcategory", + "label": "Harness", + "ids": ["integrations/harness/locations"] + }, { "type": "category", "label": "Google GCS", diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index f9e0d76aab..37bfda9861 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -30,6 +30,7 @@ import { GiteaIntegration } from '@backstage/integration'; import { GithubCredentialsProvider } from '@backstage/integration'; import { GithubIntegration } from '@backstage/integration'; import { GitLabIntegration } from '@backstage/integration'; +import { HarnessIntegration } from '@backstage/integration'; import { HostDiscovery as HostDiscovery_2 } from '@backstage/backend-app-api'; import { HttpAuthService } from '@backstage/backend-plugin-api'; import { IdentityService } from '@backstage/backend-plugin-api'; @@ -530,6 +531,31 @@ export class GitlabUrlReader implements UrlReader { toString(): string; } +// @public +export class HarnessUrlReader implements UrlReader { + constructor(integration: HarnessIntegration); + // (undocumented) + static factory: ReaderFactory; + // (undocumented) + read(url: string): Promise; + // (undocumented) + readTree(): Promise; + // (undocumented) + readUrl(url: string, options?: ReadUrlOptions): Promise; + // (undocumented) + search(): Promise; + // (undocumented) + toString(): string; +} + +// @public +export type HarnessIntegrationConfig = { + host: string; + baseUrl?: string; + username?: string; + token?: string; +}; + // @public export const HostDiscovery: typeof HostDiscovery_2; diff --git a/packages/backend-common/src/reading/HarnessCodeUrlReader.test.ts b/packages/backend-common/src/reading/HarnessCodeUrlReader.test.ts new file mode 100644 index 0000000000..3e8b70a6aa --- /dev/null +++ b/packages/backend-common/src/reading/HarnessCodeUrlReader.test.ts @@ -0,0 +1,204 @@ +/* + * Copyright 2024 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 { setupRequestMockHandlers } from '@backstage/backend-test-utils'; +import { ConfigReader } from '@backstage/config'; +import { HarnessIntegration, readHarnessConfig } from '@backstage/integration'; +import { JsonObject } from '@backstage/types'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { getVoidLogger } from '../logging'; +import { UrlReaderPredicateTuple } from './types'; +import { DefaultReadTreeResponseFactory } from './tree'; +import getRawBody from 'raw-body'; +import { HarnessUrlReader } from './HarnessUrlReader'; +import { NotFoundError } from '@backstage/errors'; + +const treeResponseFactory = DefaultReadTreeResponseFactory.create({ + config: new ConfigReader({}), +}); + +jest.mock('../scm', () => ({ + Git: { + fromAuth: () => ({ + clone: jest.fn(() => Promise.resolve({})), + }), + }, +})); + +const harnessProcessor = new HarnessUrlReader( + new HarnessIntegration( + readHarnessConfig( + new ConfigReader({ + host: 'app.harness.io', + }), + ), + ), +); + +const createReader = (config: JsonObject): UrlReaderPredicateTuple[] => { + return HarnessUrlReader.factory({ + config: new ConfigReader(config), + logger: getVoidLogger(), + treeResponseFactory, + }); +}; + +describe('HarnessUrlReader', () => { + const worker = setupServer(); + setupRequestMockHandlers(worker); + + afterAll(() => { + jest.clearAllMocks(); + }); + + describe('reader factory', () => { + it('creates a reader.', () => { + const readers = createReader({ + integrations: { + harness: [{ host: 'app.harness.io' }], + }, + }); + expect(readers).toHaveLength(1); + }); + + it('should not create a default entry.', () => { + const readers = createReader({ + integrations: {}, + }); + expect(readers).toHaveLength(0); + }); + }); + + describe('predicates', () => { + it('returns true for the configured host', () => { + const readers = createReader({ + integrations: { + harness: [{ host: 'app.harness.io' }], + }, + }); + const predicate = readers[0].predicate; + + expect(predicate(new URL('https://app.harness.io/path'))).toBe(true); + }); + + it('returns false for a different host.', () => { + const readers = createReader({ + integrations: { + harness: [{ host: 'app.harness.io' }], + }, + }); + const predicate = readers[0].predicate; + + expect(predicate(new URL('https://github.com/path'))).toBe(false); + }); + }); + + describe('readUrl', () => { + const responseBuffer = Buffer.from('Apache License'); + const harnessApiResponse = (content: any) => { + return JSON.stringify({ + encoding: 'base64', + content: Buffer.from(content).toString('base64'), + }); + }; + + it.skip('should be able to read file contents as buffer', async () => { + worker.use( + rest.get( + 'https://app.harness.io/api/v1/repos/owner/project/contents/LICENSE', + (req, res, ctx) => { + // Test utils prefers matching URL directly but it is part of Gitea's API + if (req.url.searchParams.get('ref') === 'branch2') { + return res( + ctx.status(200), + ctx.body(harnessApiResponse(responseBuffer.toString())), + ); + } + + return res(ctx.status(500)); + }, + ), + ); + + const result = await harnessProcessor.readUrl( + 'https://app.harness.io/owner/project/src/branch/branch2/LICENSE', + ); + const buffer = await result.buffer(); + expect(buffer.toString()).toBe(responseBuffer.toString()); + }); + + it.skip('should be able to read file contents as stream', async () => { + worker.use( + rest.get( + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/LICENSE.txt', + (req, res, ctx) => { + if (req.url.searchParams.get('ref') === 'refMain') { + return res( + ctx.status(200), + ctx.body(harnessApiResponse(responseBuffer.toString())), + ); + } + + return res(ctx.status(500)); + }, + ), + ); + + const result = await harnessProcessor.readUrl( + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/LICENSE.TXT', + ); + const fromStream = await getRawBody(result.stream!()); + expect(fromStream.toString()).toBe(responseBuffer.toString()); + }); + + it.skip('should raise NotFoundError on 404.', async () => { + worker.use( + rest.get( + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml', + (_, res, ctx) => { + return res(ctx.status(404, 'File not found.')); + }, + ), + ); + + await expect( + harnessProcessor.readUrl( + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml', + ), + ).rejects.toThrow(NotFoundError); + }); + + it.skip('should throw an error on non 404 errors.', async () => { + worker.use( + rest.get( + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml', + (_, res, ctx) => { + return res(ctx.status(500, 'Error!!!')); + }, + ), + ); + + await expect( + harnessProcessor.readUrl( + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml', + ), + ).rejects.toThrow( + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/content/all-apis.yaml?routingId=accountId&include_commit=false&ref=refMain, 500 Error!!!', + ); + }); + }); +}); diff --git a/packages/backend-common/src/reading/HarnessUrlReader.ts b/packages/backend-common/src/reading/HarnessUrlReader.ts new file mode 100644 index 0000000000..fd01e4f8a2 --- /dev/null +++ b/packages/backend-common/src/reading/HarnessUrlReader.ts @@ -0,0 +1,124 @@ +/* + * Copyright 2025 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 { + getHarnessRequestOptions, + getHarnessFileContentsUrl, + HarnessIntegration, + ScmIntegrations, +} from '@backstage/integration'; +import { ReadUrlOptions, ReadUrlResponse } from './types'; +import { + ReaderFactory, + ReadTreeResponse, + SearchResponse, + UrlReader, +} from './types'; +import fetch, { Response } from 'node-fetch'; +import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { + AuthenticationError, + NotFoundError, + NotModifiedError, +} from '@backstage/errors'; +import { Readable } from 'stream'; + +/** + * Implements a {@link UrlReader} for the Harness code v1 api. + * + * @public + */ +export class HarnessUrlReader implements UrlReader { + static factory: ReaderFactory = ({ config }) => { + return ScmIntegrations.fromConfig(config) + .harness.list() + .map(integration => { + const reader = new HarnessUrlReader(integration); + const predicate = (url: URL) => { + return url.host === integration.config.host; + }; + return { reader, predicate }; + }); + }; + + constructor(private readonly integration: HarnessIntegration) {} + + async read(url: string): Promise { + const response = await this.readUrl(url); + return response.buffer(); + } + + async readUrl( + url: string, + options?: ReadUrlOptions, + ): Promise { + let response: Response; + const blobUrl = getHarnessFileContentsUrl(this.integration.config, url); + + try { + response = await fetch(blobUrl, { + method: 'GET', + ...getHarnessRequestOptions(this.integration.config), + signal: options?.signal as any, + }); + } catch (e) { + throw new Error(`Unable to read ${blobUrl}, ${e}`); + } + + if (response.ok) { + // Harness Code returns an object with the file contents encoded, not the file itself + const jsonResponse = await response.json(); + if (jsonResponse?.content?.encoding === 'base64') { + return ReadUrlResponseFactory.fromReadable( + Readable.from(Buffer.from(jsonResponse?.content?.data, 'base64')), + { + etag: response.headers.get('ETag') ?? undefined, + }, + ); + } + + throw new Error(`Unknown encoding: ${jsonResponse?.content?.encoding}`); + } + + const message = `${url} x ${blobUrl}, ${response.status} ${response.statusText}`; + if (response.status === 404) { + throw new NotFoundError(message); + } + + if (response.status === 304) { + throw new NotModifiedError(); + } + + if (response.status === 403) { + throw new AuthenticationError(); + } + + throw new Error(message); + } + + readTree(): Promise { + throw new Error('HarnessUrlReader readTree not implemented.'); + } + search(): Promise { + throw new Error('HarnessUrlReader search not implemented.'); + } + + toString() { + const { host } = this.integration.config; + return `harness{host=${host},authed=${Boolean( + this.integration.config.token, + )}}`; + } +} diff --git a/packages/backend-common/src/reading/UrlReaders.ts b/packages/backend-common/src/reading/UrlReaders.ts index e987eb9186..7aaaf120b4 100644 --- a/packages/backend-common/src/reading/UrlReaders.ts +++ b/packages/backend-common/src/reading/UrlReaders.ts @@ -31,6 +31,7 @@ import { GoogleGcsUrlReader } from './GoogleGcsUrlReader'; import { AwsS3UrlReader } from './AwsS3UrlReader'; import { GiteaUrlReader } from './GiteaUrlReader'; import { AwsCodeCommitUrlReader } from './AwsCodeCommitUrlReader'; +import { HarnessUrlReader } from './HarnessUrlReader'; /** * Creation options for {@link @backstage/backend-plugin-api#UrlReaderService}. @@ -61,7 +62,6 @@ export class UrlReaders { const treeResponseFactory = DefaultReadTreeResponseFactory.create({ config, }); - for (const factory of factories ?? []) { const tuples = factory({ config, logger: logger, treeResponseFactory }); @@ -94,6 +94,7 @@ export class UrlReaders { GiteaUrlReader.factory, GitlabUrlReader.factory, GoogleGcsUrlReader.factory, + HarnessUrlReader.factory, AwsS3UrlReader.factory, AwsCodeCommitUrlReader.factory, FetchUrlReader.factory, diff --git a/packages/backend-common/src/reading/index.ts b/packages/backend-common/src/reading/index.ts index 21e82da9b5..a99bb6dda1 100644 --- a/packages/backend-common/src/reading/index.ts +++ b/packages/backend-common/src/reading/index.ts @@ -22,6 +22,7 @@ export { GerritUrlReader } from './GerritUrlReader'; export { GithubUrlReader } from './GithubUrlReader'; export { GitlabUrlReader } from './GitlabUrlReader'; export { GiteaUrlReader } from './GiteaUrlReader'; +export { HarnessUrlReader } from './HarnessUrlReader'; export { AwsS3UrlReader } from './AwsS3UrlReader'; export { FetchUrlReader } from './FetchUrlReader'; export { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; diff --git a/packages/integration/api-report.md b/packages/integration/api-report.md index 6b691dff80..a693c1314c 100644 --- a/packages/integration/api-report.md +++ b/packages/integration/api-report.md @@ -513,6 +513,19 @@ export function getGitLabRequestOptions(config: GitLabIntegrationConfig): { headers: Record; }; +// @public +export function getHarnessFileContentsUrl( + config: HarnessIntegrationConfig, + url: string, +): string; + +// @public +export function getHarnessRequestOptions( + config: HarnessIntegrationConfig, +): { + headers?: Record; +}; + // @public export class GiteaIntegration implements ScmIntegration { constructor(config: GiteaIntegrationConfig); @@ -539,7 +552,7 @@ export type GiteaIntegrationConfig = { host: string; baseUrl?: string; username?: string; - password?: string; + token?: string; }; // @public @@ -674,6 +687,35 @@ export type GoogleGcsIntegrationConfig = { privateKey?: string; }; +// @public +export class HarnessIntegration implements ScmIntegration { + constructor(config: HarnessIntegrationConfig); + // (undocumented) + readonly config: HarnessIntegrationConfig; + // (undocumented) + static factory: ScmIntegrationsFactory; + // (undocumented) + resolveEditUrl(url: string): string; + // (undocumented) + resolveUrl(options: { + url: string; + base: string; + lineNumber?: number | undefined; + }): string; + // (undocumented) + get title(): string; + // (undocumented) + get type(): string; +} + +// @public +export type HarnessIntegrationConfig = { + host: string; + baseUrl?: string; + username?: string; + token?: string; +}; + // @public export interface IntegrationsByType { // (undocumented) @@ -696,6 +738,8 @@ export interface IntegrationsByType { github: ScmIntegrationsGroup; // (undocumented) gitlab: ScmIntegrationsGroup; + // (undocumented) + harness: ScmIntegrationsGroup; } // @public @@ -839,6 +883,11 @@ export function readGoogleGcsIntegrationConfig( config: Config, ): GoogleGcsIntegrationConfig; +// @public +export function readHarnessConfig( + config: Config, +): HarnessIntegrationConfig; + // @public @deprecated (undocumented) export const replaceGitHubUrlType: typeof replaceGithubUrlType; @@ -889,6 +938,8 @@ export interface ScmIntegrationRegistry github: ScmIntegrationsGroup; // (undocumented) gitlab: ScmIntegrationsGroup; + // (undocumented) + harness: ScmIntegrationsGroup; resolveEditUrl(url: string): string; resolveUrl(options: { url: string; @@ -927,6 +978,8 @@ export class ScmIntegrations implements ScmIntegrationRegistry { // (undocumented) get gitlab(): ScmIntegrationsGroup; // (undocumented) + get harness(): ScmIntegrationsGroup; + // (undocumented) list(): ScmIntegration[]; // (undocumented) resolveEditUrl(url: string): string; diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts index 44303bf25c..01f1f44d73 100644 --- a/packages/integration/config.d.ts +++ b/packages/integration/config.d.ts @@ -345,5 +345,29 @@ export interface Config { */ password?: string; }>; + /** Integration configuration for Harness Code */ + harness?: Array<{ + /** + * The hostname of the given Harness Code instance + * @visibility frontend + */ + host: string; + /** + * The base url for the Gitea instance. + * @visibility frontend + */ + baseUrl?: string; + + /** + * The username to use for authenticated requests. + * @visibility secret + */ + username?: string; + /** + * Harness Code token used to authenticate requests. This can be either a generated access token. + * @visibility secret + */ + token?: string; + }>; }; } diff --git a/packages/integration/src/ScmIntegrations.test.ts b/packages/integration/src/ScmIntegrations.test.ts index acf602e38d..c758816c03 100644 --- a/packages/integration/src/ScmIntegrations.test.ts +++ b/packages/integration/src/ScmIntegrations.test.ts @@ -38,6 +38,7 @@ import { ScmIntegrations } from './ScmIntegrations'; import { GiteaIntegration, GiteaIntegrationConfig } from './gitea'; import { AwsCodeCommitIntegration } from './awsCodeCommit/AwsCodeCommitIntegration'; import { AwsCodeCommitIntegrationConfig } from './awsCodeCommit'; +import { HarnessIntegration, HarnessIntegrationConfig } from './harness'; describe('ScmIntegrations', () => { const awsS3 = new AwsS3Integration({ @@ -80,6 +81,10 @@ describe('ScmIntegrations', () => { host: 'gitea.local', } as GiteaIntegrationConfig); + const harness = new HarnessIntegration({ + host: 'harness.local', + } as HarnessIntegrationConfig); + const i = new ScmIntegrations({ awsS3: basicIntegrations([awsS3], item => item.config.host), awsCodeCommit: basicIntegrations([awsCodeCommit], item => item.config.host), @@ -94,6 +99,7 @@ describe('ScmIntegrations', () => { github: basicIntegrations([github], item => item.config.host), gitlab: basicIntegrations([gitlab], item => item.config.host), gitea: basicIntegrations([gitea], item => item.config.host), + harness: basicIntegrations([harness], item => item.config.host), }); it('can get the specifics', () => { @@ -113,6 +119,7 @@ describe('ScmIntegrations', () => { expect(i.github.byUrl('https://github.local')).toBe(github); expect(i.gitlab.byUrl('https://gitlab.local')).toBe(gitlab); expect(i.gitea.byUrl('https://gitea.local')).toBe(gitea); + expect(i.harness.byUrl('https://harness.local')).toBe(harness); }); it('can list', () => { @@ -128,6 +135,7 @@ describe('ScmIntegrations', () => { github, gitlab, gitea, + harness, ]), ); }); @@ -143,6 +151,7 @@ describe('ScmIntegrations', () => { expect(i.byUrl('https://github.local')).toBe(github); expect(i.byUrl('https://gitlab.local')).toBe(gitlab); expect(i.byUrl('https://gitea.local')).toBe(gitea); + expect(i.byUrl('https://harness.local')).toBe(harness); expect(i.byHost('awss3.local')).toBe(awsS3); expect(i.byHost('awscodecommit.local')).toBe(awsCodeCommit); diff --git a/packages/integration/src/ScmIntegrations.ts b/packages/integration/src/ScmIntegrations.ts index 6a1faaa75b..e0d430d834 100644 --- a/packages/integration/src/ScmIntegrations.ts +++ b/packages/integration/src/ScmIntegrations.ts @@ -28,6 +28,7 @@ import { defaultScmResolveUrl } from './helpers'; import { ScmIntegration, ScmIntegrationsGroup } from './types'; import { ScmIntegrationRegistry } from './registry'; import { GiteaIntegration } from './gitea'; +import { HarnessIntegration } from './harness/HarnessIntegration'; /** * The set of supported integrations. @@ -48,6 +49,7 @@ export interface IntegrationsByType { github: ScmIntegrationsGroup; gitlab: ScmIntegrationsGroup; gitea: ScmIntegrationsGroup; + harness: ScmIntegrationsGroup; } /** @@ -70,6 +72,7 @@ export class ScmIntegrations implements ScmIntegrationRegistry { github: GithubIntegration.factory({ config }), gitlab: GitLabIntegration.factory({ config }), gitea: GiteaIntegration.factory({ config }), + harness: HarnessIntegration.factory({ config }), }); } @@ -120,6 +123,10 @@ export class ScmIntegrations implements ScmIntegrationRegistry { return this.byType.gitea; } + get harness(): ScmIntegrationsGroup { + return this.byType.harness; + } + list(): ScmIntegration[] { return Object.values(this.byType).flatMap( i => i.list() as ScmIntegration[], diff --git a/packages/integration/src/harness/HarnessIntegration.test.ts b/packages/integration/src/harness/HarnessIntegration.test.ts new file mode 100644 index 0000000000..9014c0bb79 --- /dev/null +++ b/packages/integration/src/harness/HarnessIntegration.test.ts @@ -0,0 +1,128 @@ +/* + * Copyright 2024 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 { ConfigReader } from '@backstage/config'; +import { HarnessIntegration } from './HarnessIntegration'; + +describe('HarnessIntegration', () => { + it('has a working factory', () => { + const integrations = HarnessIntegration.factory({ + config: new ConfigReader({ + integrations: { + harness: [ + { + host: 'app.harness.io', + username: 'git', + baseUrl: 'https://app.harness.io/route', + token: '1234', + }, + ], + }, + }), + }); + expect(integrations.list().length).toBe(1); + expect(integrations.list()[0].config.host).toBe('app.harness.io'); + expect(integrations.list()[0].config.baseUrl).toBe( + 'https://app.harness.io/route', + ); + }); + + it('returns the basics', () => { + const integration = new HarnessIntegration({ + host: 'app.harness.io', + }); + expect(integration.type).toBe('harness'); + expect(integration.title).toBe('app.harness.io'); + }); + + describe('resolveUrl', () => { + it('works for valid urls, ignoring line number', () => { + const integration = new HarnessIntegration({ + host: 'app.harness.io', + }); + + expect( + integration.resolveUrl({ + url: 'https://app.harness.io/catalog-info.yaml', + base: 'https://app.harness.io/catalog-info.yaml', + lineNumber: 9, + }), + ).toBe('https://app.harness.io/catalog-info.yaml'); + }); + + it('handles line numbers', () => { + const integration = new HarnessIntegration({ + host: 'app.harness.io', + }); + + expect( + integration.resolveUrl({ + url: '', + base: 'https://app.harness.io/catalog-info.yaml#4', + lineNumber: 9, + }), + ).toBe('https://app.harness.io/catalog-info.yaml#L9'); + }); + }); + + describe('resolves with a relative url', () => { + it('works for valid urls', () => { + const integration = new HarnessIntegration({ + host: 'app.harness.io', + }); + + expect( + integration.resolveUrl({ + url: './skeleton', + base: 'https://app.harness.io/git/plugins/repo/+/refs/heads/master/template.yaml', + }), + ).toBe( + 'https://app.harness.io/git/plugins/repo/+/refs/heads/master/skeleton', + ); + }); + }); + + describe('resolves with an absolute url', () => { + it('works for valid urls', () => { + const integration = new HarnessIntegration({ + host: 'app.harness.io', + }); + + expect( + integration.resolveUrl({ + url: '/catalog-info.yaml', + base: 'https://app.harness.io/git/repo/+/refs/heads/master/', + }), + ).toBe( + 'https://app.harness.io/git/repo/+/refs/heads/master/catalog-info.yaml', + ); + }); + }); + + it('resolve edit URL', () => { + const integration = new HarnessIntegration({ + host: 'app.harness.io', + }); + + expect( + integration.resolveEditUrl( + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/edit/refMain/~/all-apis.yaml', + ), + ).toBe( + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/edit/all-apis.yaml', + ); + }); +}); diff --git a/packages/integration/src/harness/HarnessIntegration.ts b/packages/integration/src/harness/HarnessIntegration.ts new file mode 100644 index 0000000000..5d1b274149 --- /dev/null +++ b/packages/integration/src/harness/HarnessIntegration.ts @@ -0,0 +1,58 @@ +/* + * Copyright 2024 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 { basicIntegrations, defaultScmResolveUrl } from '../helpers'; +import { ScmIntegration, ScmIntegrationsFactory } from '../types'; +import { HarnessIntegrationConfig, readHarnessConfig } from './config'; +import { getHarnessEditContentsUrl } from './core'; + +/** + * A Harness Code based integration. + * + * @public + */ +export class HarnessIntegration implements ScmIntegration { + static factory: ScmIntegrationsFactory = ({ config }) => { + const configs = config.getOptionalConfigArray('integrations.harness') ?? []; + const harnessConfigs = configs.map(c => readHarnessConfig(c)); + + return basicIntegrations( + harnessConfigs.map(c => new HarnessIntegration(c)), + (harness: HarnessIntegration) => harness.config.host, + ); + }; + + constructor(readonly config: HarnessIntegrationConfig) {} + + get type(): string { + return 'harness'; + } + + get title(): string { + return this.config.host; + } + + resolveUrl(options: { + url: string; + base: string; + lineNumber?: number | undefined; + }): string { + return defaultScmResolveUrl(options); + } + + resolveEditUrl(url: string): string { + return getHarnessEditContentsUrl(this.config, url); + } +} diff --git a/packages/integration/src/harness/config.test.ts b/packages/integration/src/harness/config.test.ts new file mode 100644 index 0000000000..6482e89de8 --- /dev/null +++ b/packages/integration/src/harness/config.test.ts @@ -0,0 +1,108 @@ +/* + * Copyright 2024 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 { Config, ConfigReader } from '@backstage/config'; +import { loadConfigSchema } from '@backstage/config-loader'; +import { HarnessIntegrationConfig, readHarnessConfig } from './config'; + +describe('readHarnessConfig', () => { + function buildConfig(data: Partial): Config { + return new ConfigReader(data); + } + + async function buildFrontendConfig( + data: Partial, + ): Promise { + const fullSchema = await loadConfigSchema({ + dependencies: ['@backstage/integration'], + }); + const serializedSchema = fullSchema.serialize() as { + schemas: { value: { properties?: { integrations?: object } } }[]; + }; + const schema = await loadConfigSchema({ + serialized: { + ...serializedSchema, // only include schemas that apply to integrations + schemas: serializedSchema.schemas.filter( + s => s.value?.properties?.integrations, + ), + }, + }); + const processed = schema.process( + [{ data: { integrations: { harness: [data] } }, context: 'app' }], + { visibility: ['frontend'] }, + ); + return new ConfigReader((processed[0].data as any).integrations.harness[0]); + } + + it('reads all values', () => { + const output = readHarnessConfig( + buildConfig({ + host: 'a.com', + baseUrl: 'https://a.com/route/api', + username: 'u', + token: 'p', + }), + ); + expect(output).toEqual({ + host: 'a.com', + baseUrl: 'https://a.com/route/api', + username: 'u', + token: 'p', + }); + }); + + it('can create a default value if the API base URL is missing', () => { + const output = readHarnessConfig( + buildConfig({ + host: 'a.com', + }), + ); + expect(output).toEqual({ + host: 'a.com', + baseUrl: 'https://a.com', + username: undefined, + token: undefined, + }); + }); + + it('rejects funky configs', () => { + const valid: any = { + host: 'a.com', + }; + expect(() => readHarnessConfig(buildConfig({ ...valid, host: 2 }))).toThrow( + /host/, + ); + expect(() => + readHarnessConfig(buildConfig({ ...valid, baseUrl: 2 })), + ).toThrow(/baseUrl/); + }); + + it('works on the frontend', async () => { + expect( + readHarnessConfig( + await buildFrontendConfig({ + host: 'a.com', + baseUrl: 'https://a.com/route', + username: 'u', + token: 'p', + }), + ), + ).toEqual({ + host: 'a.com', + baseUrl: 'https://a.com/route', + }); + }); +}); diff --git a/packages/integration/src/harness/config.ts b/packages/integration/src/harness/config.ts new file mode 100644 index 0000000000..75482a9b39 --- /dev/null +++ b/packages/integration/src/harness/config.ts @@ -0,0 +1,78 @@ +/* + * Copyright 2024 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 { Config } from '@backstage/config'; +import { trimEnd } from 'lodash'; +import { isValidHost } from '../helpers'; + +/** + * The configuration for a single Gitea integration. + * + * @public + */ +export type HarnessIntegrationConfig = { + /** + * The host of the target that this matches on, e.g. "app.harness.io" + */ + host: string; + /** + * The optional base URL of the Harness code instance. It is assumed that https + * is used and that the base path is "/" on the host. If that is not the + * case set the complete base url to the Harness code instance, e.g. + * "https://harnesscode.website.com/". This is the url that you would open + * in a browser. + */ + baseUrl?: string; + /** + * The username to use for requests to harness code. + */ + username?: string; + + /** + * The password or http token to use for authentication. + */ + token?: string; +}; + +/** + * Parses a location config block for use in HarnessIntegration + * + * @public + */ +export function readHarnessConfig(config: Config): HarnessIntegrationConfig { + const host = config.getString('host'); + let baseUrl = config.getOptionalString('baseUrl'); + const username = config.getOptionalString('username'); + const token = config.getOptionalString('token'); + if (!isValidHost(host)) { + throw new Error( + `Invalid Harness Code integration config, '${host}' is not a valid host`, + ); + } + + if (baseUrl) { + baseUrl = trimEnd(baseUrl, '/'); + } else { + baseUrl = `https://${host}`; + } + + return { + host, + baseUrl, + username, + token, + }; +} diff --git a/packages/integration/src/harness/core.test.ts b/packages/integration/src/harness/core.test.ts new file mode 100644 index 0000000000..6502fd3e48 --- /dev/null +++ b/packages/integration/src/harness/core.test.ts @@ -0,0 +1,95 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { setupServer } from 'msw/node'; +import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { HarnessIntegrationConfig } from './config'; +import { + getHarnessEditContentsUrl, + getHarnessFileContentsUrl, + getHarnessRequestOptions, +} from './core'; + +describe('Harness code core', () => { + const worker = setupServer(); + setupRequestMockHandlers(worker); + + describe('getHarnessFileContentsUrl', () => { + it('can create an url from arguments', () => { + const config: HarnessIntegrationConfig = { + host: 'app.harness.io', + }; + expect( + getHarnessFileContentsUrl( + config, + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml', + ), + ).toEqual( + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/content/all-apis.yaml?routingId=accountId&include_commit=false&ref=refMain', + ); + }); + }); + + describe('getHarnessEditContentsUrl', () => { + it('can create an url from arguments', () => { + const config: HarnessIntegrationConfig = { + host: 'app.harness.io', + }; + expect( + getHarnessEditContentsUrl( + config, + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/edit/refMain/~/all-apis.yaml', + ), + ).toEqual( + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/edit/all-apis.yaml', + ); + }); + }); + + describe('getGerritRequestOptions', () => { + it('adds token header when only a token is specified', () => { + const authRequest: HarnessIntegrationConfig = { + host: 'gerrit.com', + token: 'P', + }; + const anonymousRequest: HarnessIntegrationConfig = { + host: 'gerrit.com', + }; + expect( + (getHarnessRequestOptions(authRequest).headers as any).Authorization, + ).toEqual('Bearer P'); + expect( + getHarnessRequestOptions(anonymousRequest).headers, + ).toBeUndefined(); + }); + + it('adds basic auth when username and token are specified', () => { + const authRequest: HarnessIntegrationConfig = { + host: 'gerrit.com', + username: 'username', + token: 'P', + }; + + const basicAuthentication = `basic ${Buffer.from( + `${authRequest.username}:${authRequest.token}`, + ).toString('base64')}`; + + expect( + (getHarnessRequestOptions(authRequest).headers as any).Authorization, + ).toEqual(basicAuthentication); + }); + }); +}); diff --git a/packages/integration/src/harness/core.ts b/packages/integration/src/harness/core.ts new file mode 100644 index 0000000000..0c4fb01970 --- /dev/null +++ b/packages/integration/src/harness/core.ts @@ -0,0 +1,135 @@ +/* + * Copyright 2024 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 { HarnessIntegrationConfig } from './config'; + +/** + * Given a URL pointing to a file, returns a URL + * for editing the contents of the data. + * + * @remarks + * + * Converts + * from: https://app.harness.io/a/b/src/branchname/path/to/c.yaml + * or: https://app.harness.io/a/b/_edit/branchname/path/to/c.yaml + * + * @param url - A URL pointing to a file + * @param config - The relevant provider config + * @public + */ +export function getHarnessEditContentsUrl( + config: HarnessIntegrationConfig, + url: string, +) { + try { + const baseUrl = config.baseUrl ?? `https://${config.host}`; + const [ + _blank, + _ng, + _account, + accountId, + _module, + _moduleName, + _org, + orgName, + _projects, + projectName, + _repos, + repoName, + _files, + _ref, + _branch, + ...path + ] = url.replace(baseUrl, '').split('/'); + const pathWithoutSlash = path.join('/').replace(/^\//, ''); + return `${baseUrl}/gateway/code/api/v1/repos/${accountId}/${orgName}/${projectName}/${repoName}/+/edit/${pathWithoutSlash}`; + } catch (e) { + throw new Error(`Incorrect URL: ${url}, ${e}`); + } +} + +/** + * Given a URL pointing to a file, returns an api URL + * for fetching the contents of the data. + * + * @remarks + * + * Converts + * from: https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml + * to: https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/content/all-apis.yaml?routingId=accountId&include_commit=false&ref=refMain + * + * @param url - A URL pointing to a file + * @param config - The relevant provider config + * @public + */ +export function getHarnessFileContentsUrl( + config: HarnessIntegrationConfig, + url: string, +) { + try { + const baseUrl = config.baseUrl ?? `https://${config.host}`; + const [ + _blank, + _ng, + _account, + accountId, + _module, + _moduleName, + _org, + orgName, + _projects, + projectName, + _repos, + repoName, + _files, + ref, + _branch, + ...path + ] = url.replace(baseUrl, '').split('/'); + const pathWithoutSlash = path.join('/').replace(/^\//, ''); + return `${baseUrl}/gateway/code/api/v1/repos/${accountId}/${orgName}/${projectName}/${repoName}/+/content/${pathWithoutSlash}?routingId=${accountId}&include_commit=false&ref=${ref}`; + } catch (e) { + throw new Error(`Incorrect URL: ${url}, ${e}`); + } +} + +/** + * Return request headers for a Harness Code provider. + * + * @param config - A Harness Code provider config + * @public + */ +export function getHarnessRequestOptions(config: HarnessIntegrationConfig): { + headers?: Record; +} { + const headers: Record = {}; + const { username, token } = config; + + if (!token) { + return headers; + } + + if (username) { + headers.Authorization = `basic ${Buffer.from( + `${username}:${token}`, + ).toString('base64')}`; + } else { + headers.Authorization = `Bearer ${token}`; + } + + return { + headers, + }; +} diff --git a/packages/integration/src/harness/index.ts b/packages/integration/src/harness/index.ts new file mode 100644 index 0000000000..264df657f0 --- /dev/null +++ b/packages/integration/src/harness/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright 2024 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 { HarnessIntegration } from './HarnessIntegration'; +export { getHarnessRequestOptions, getHarnessFileContentsUrl } from './core'; +export { readHarnessConfig } from './config'; +export type { HarnessIntegrationConfig } from './config'; diff --git a/packages/integration/src/index.ts b/packages/integration/src/index.ts index b20477ee6a..32c573abef 100644 --- a/packages/integration/src/index.ts +++ b/packages/integration/src/index.ts @@ -31,6 +31,7 @@ export * from './gitea'; export * from './github'; export * from './gitlab'; export * from './googleGcs'; +export * from './harness'; export { defaultScmResolveUrl } from './helpers'; export { ScmIntegrations } from './ScmIntegrations'; export type { IntegrationsByType } from './ScmIntegrations'; diff --git a/packages/integration/src/registry.ts b/packages/integration/src/registry.ts index 00706acc1c..7e4b34cc34 100644 --- a/packages/integration/src/registry.ts +++ b/packages/integration/src/registry.ts @@ -25,6 +25,7 @@ import { GerritIntegration } from './gerrit/GerritIntegration'; import { GithubIntegration } from './github/GithubIntegration'; import { GitLabIntegration } from './gitlab/GitLabIntegration'; import { GiteaIntegration } from './gitea/GiteaIntegration'; +import { HarnessIntegration } from './harness/HarnessIntegration'; /** * Holds all registered SCM integrations, of all types. @@ -46,6 +47,7 @@ export interface ScmIntegrationRegistry github: ScmIntegrationsGroup; gitlab: ScmIntegrationsGroup; gitea: ScmIntegrationsGroup; + harness: ScmIntegrationsGroup; /** * Resolves an absolute or relative URL in relation to a base URL. * From 4750bf66223a0befc33ab8226c7036a5f0d2e898 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Sun, 21 Apr 2024 19:39:59 -0600 Subject: [PATCH 023/136] Update .changeset/empty-beers-relax.md Co-authored-by: Himanshu Mishra Signed-off-by: Calvin Lee --- .changeset/empty-beers-relax.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/empty-beers-relax.md b/.changeset/empty-beers-relax.md index 526f88c1c7..a285b9e7b4 100644 --- a/.changeset/empty-beers-relax.md +++ b/.changeset/empty-beers-relax.md @@ -2,4 +2,4 @@ '@backstage/backend-common': patch --- -This patch adds HarnessURLReader to the available classes. It currently only reads single files via Harness codes public repo api. +This patch adds HarnessURLReader. It only supports readUrl for now. readTree and search will be implemented next. From d422716946e6bd1ca2072f21b510add272eb0b59 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Sun, 21 Apr 2024 20:31:45 -0600 Subject: [PATCH 024/136] integration support for harness p2-comments Signed-off-by: Calvin Lee --- docs/integrations/harness/locations.md | 12 +++---- .../src/reading/HarnessUrlReader.ts | 2 +- packages/integration/api-report.md | 5 ++- .../src/harness/HarnessIntegration.test.ts | 5 --- .../integration/src/harness/config.test.ts | 11 ++----- packages/integration/src/harness/config.ts | 32 ++++++------------- packages/integration/src/harness/core.test.ts | 12 +++---- packages/integration/src/harness/core.ts | 17 ++++------ 8 files changed, 31 insertions(+), 65 deletions(-) diff --git a/docs/integrations/harness/locations.md b/docs/integrations/harness/locations.md index 8911d7918c..a3d0e2cfd4 100644 --- a/docs/integrations/harness/locations.md +++ b/docs/integrations/harness/locations.md @@ -20,14 +20,14 @@ integrations: harness: - host: app.harness.io token: ${HARNESS_CODE_BEARER_TOKEN} + apiKey: ${HARNESS_CODE_APIKEY} ``` -Directly under the `harnessCode` key is a list of provider configurations, where you -can list the Gitea instances you want to be able to fetch -data from. Each entry is a structure with up to four elements: +Directly under the `harness` key is a list of provider configurations, where you +can list the Harness instances you want to be able to fetch + +check out https://developer.harness.io/docs/platform/automation/api/add-and-manage-api-keys/ for more information - `host`: The host of the Harness Code instance that you want to match on. -- `baseUrl` (optional): Needed if the Harness Code instance is not reachable at - the base of the `host` option (e.g. `https://app.harness.io`). This is the address that you would open in a browser. -- `username` (optional): The gitea username to use in API requests. - `token` (optional): The password or api token to authenticate with. +- `apiKey` (optional): The apiKey to authenticate with. diff --git a/packages/backend-common/src/reading/HarnessUrlReader.ts b/packages/backend-common/src/reading/HarnessUrlReader.ts index fd01e4f8a2..95114ae9d6 100644 --- a/packages/backend-common/src/reading/HarnessUrlReader.ts +++ b/packages/backend-common/src/reading/HarnessUrlReader.ts @@ -118,7 +118,7 @@ export class HarnessUrlReader implements UrlReader { toString() { const { host } = this.integration.config; return `harness{host=${host},authed=${Boolean( - this.integration.config.token, + this.integration.config.token || this.integration.config.apiKey, )}}`; } } diff --git a/packages/integration/api-report.md b/packages/integration/api-report.md index a693c1314c..b40b66b0b6 100644 --- a/packages/integration/api-report.md +++ b/packages/integration/api-report.md @@ -552,7 +552,7 @@ export type GiteaIntegrationConfig = { host: string; baseUrl?: string; username?: string; - token?: string; + password?: string; }; // @public @@ -711,8 +711,7 @@ export class HarnessIntegration implements ScmIntegration { // @public export type HarnessIntegrationConfig = { host: string; - baseUrl?: string; - username?: string; + apiKey?: string; token?: string; }; diff --git a/packages/integration/src/harness/HarnessIntegration.test.ts b/packages/integration/src/harness/HarnessIntegration.test.ts index 9014c0bb79..2d85204f16 100644 --- a/packages/integration/src/harness/HarnessIntegration.test.ts +++ b/packages/integration/src/harness/HarnessIntegration.test.ts @@ -25,8 +25,6 @@ describe('HarnessIntegration', () => { harness: [ { host: 'app.harness.io', - username: 'git', - baseUrl: 'https://app.harness.io/route', token: '1234', }, ], @@ -35,9 +33,6 @@ describe('HarnessIntegration', () => { }); expect(integrations.list().length).toBe(1); expect(integrations.list()[0].config.host).toBe('app.harness.io'); - expect(integrations.list()[0].config.baseUrl).toBe( - 'https://app.harness.io/route', - ); }); it('returns the basics', () => { diff --git a/packages/integration/src/harness/config.test.ts b/packages/integration/src/harness/config.test.ts index 6482e89de8..4f6d8496e3 100644 --- a/packages/integration/src/harness/config.test.ts +++ b/packages/integration/src/harness/config.test.ts @@ -51,16 +51,14 @@ describe('readHarnessConfig', () => { const output = readHarnessConfig( buildConfig({ host: 'a.com', - baseUrl: 'https://a.com/route/api', - username: 'u', token: 'p', + apiKey: 'a', }), ); expect(output).toEqual({ host: 'a.com', - baseUrl: 'https://a.com/route/api', - username: 'u', token: 'p', + apiKey: 'a', }); }); @@ -72,8 +70,6 @@ describe('readHarnessConfig', () => { ); expect(output).toEqual({ host: 'a.com', - baseUrl: 'https://a.com', - username: undefined, token: undefined, }); }); @@ -95,14 +91,11 @@ describe('readHarnessConfig', () => { readHarnessConfig( await buildFrontendConfig({ host: 'a.com', - baseUrl: 'https://a.com/route', - username: 'u', token: 'p', }), ), ).toEqual({ host: 'a.com', - baseUrl: 'https://a.com/route', }); }); }); diff --git a/packages/integration/src/harness/config.ts b/packages/integration/src/harness/config.ts index 75482a9b39..748cd141c5 100644 --- a/packages/integration/src/harness/config.ts +++ b/packages/integration/src/harness/config.ts @@ -15,11 +15,10 @@ */ import { Config } from '@backstage/config'; -import { trimEnd } from 'lodash'; import { isValidHost } from '../helpers'; /** - * The configuration for a single Gitea integration. + * The configuration for a single Harness integration. * * @public */ @@ -28,23 +27,14 @@ export type HarnessIntegrationConfig = { * The host of the target that this matches on, e.g. "app.harness.io" */ host: string; - /** - * The optional base URL of the Harness code instance. It is assumed that https - * is used and that the base path is "/" on the host. If that is not the - * case set the complete base url to the Harness code instance, e.g. - * "https://harnesscode.website.com/". This is the url that you would open - * in a browser. - */ - baseUrl?: string; - /** - * The username to use for requests to harness code. - */ - username?: string; - /** * The password or http token to use for authentication. */ token?: string; + /** + * The API key to use for authentication. + */ + apiKey?: string; }; /** @@ -55,24 +45,20 @@ export type HarnessIntegrationConfig = { export function readHarnessConfig(config: Config): HarnessIntegrationConfig { const host = config.getString('host'); let baseUrl = config.getOptionalString('baseUrl'); - const username = config.getOptionalString('username'); const token = config.getOptionalString('token'); + const apiKey = config.getOptionalString('apiKey'); + if (!isValidHost(host)) { throw new Error( `Invalid Harness Code integration config, '${host}' is not a valid host`, ); } - if (baseUrl) { - baseUrl = trimEnd(baseUrl, '/'); - } else { - baseUrl = `https://${host}`; - } + baseUrl = `https://${host}`; return { host, - baseUrl, - username, + apiKey, token, }; } diff --git a/packages/integration/src/harness/core.test.ts b/packages/integration/src/harness/core.test.ts index 6502fd3e48..2a214cc06f 100644 --- a/packages/integration/src/harness/core.test.ts +++ b/packages/integration/src/harness/core.test.ts @@ -76,20 +76,16 @@ describe('Harness code core', () => { ).toBeUndefined(); }); - it('adds basic auth when username and token are specified', () => { + it('adds basic auth when apikey and token are specified', () => { const authRequest: HarnessIntegrationConfig = { host: 'gerrit.com', - username: 'username', token: 'P', + apiKey: 'a', }; - const basicAuthentication = `basic ${Buffer.from( - `${authRequest.username}:${authRequest.token}`, - ).toString('base64')}`; - expect( - (getHarnessRequestOptions(authRequest).headers as any).Authorization, - ).toEqual(basicAuthentication); + (getHarnessRequestOptions(authRequest).headers as any)['x-api-key'], + ).toEqual('a'); }); }); }); diff --git a/packages/integration/src/harness/core.ts b/packages/integration/src/harness/core.ts index 0c4fb01970..324a57071c 100644 --- a/packages/integration/src/harness/core.ts +++ b/packages/integration/src/harness/core.ts @@ -34,7 +34,7 @@ export function getHarnessEditContentsUrl( url: string, ) { try { - const baseUrl = config.baseUrl ?? `https://${config.host}`; + const baseUrl = `https://${config.host}`; const [ _blank, _ng, @@ -61,9 +61,8 @@ export function getHarnessEditContentsUrl( } /** - * Given a URL pointing to a file, returns an api URL - * for fetching the contents of the data. - * + * Given a file path URL, + * it returns an API URL which returns the contents of the file. * @remarks * * Converts @@ -79,7 +78,7 @@ export function getHarnessFileContentsUrl( url: string, ) { try { - const baseUrl = config.baseUrl ?? `https://${config.host}`; + const baseUrl = `https://${config.host}`; const [ _blank, _ng, @@ -115,16 +114,14 @@ export function getHarnessRequestOptions(config: HarnessIntegrationConfig): { headers?: Record; } { const headers: Record = {}; - const { username, token } = config; + const { token, apiKey } = config; if (!token) { return headers; } - if (username) { - headers.Authorization = `basic ${Buffer.from( - `${username}:${token}`, - ).toString('base64')}`; + if (apiKey) { + headers['x-api-key'] = apiKey; } else { headers.Authorization = `Bearer ${token}`; } From 6a0e918dc69d6e46d350485c4fea14c54cea3847 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 23 Apr 2024 00:23:33 -0600 Subject: [PATCH 025/136] integration support for harness p3-comments Signed-off-by: Calvin Lee --- .../{HarnessCodeUrlReader.test.ts => HarnessUrlReader.test.ts} | 2 +- packages/integration/src/harness/core.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename packages/backend-common/src/reading/{HarnessCodeUrlReader.test.ts => HarnessUrlReader.test.ts} (98%) diff --git a/packages/backend-common/src/reading/HarnessCodeUrlReader.test.ts b/packages/backend-common/src/reading/HarnessUrlReader.test.ts similarity index 98% rename from packages/backend-common/src/reading/HarnessCodeUrlReader.test.ts rename to packages/backend-common/src/reading/HarnessUrlReader.test.ts index 3e8b70a6aa..18c523b959 100644 --- a/packages/backend-common/src/reading/HarnessCodeUrlReader.test.ts +++ b/packages/backend-common/src/reading/HarnessUrlReader.test.ts @@ -60,7 +60,7 @@ const createReader = (config: JsonObject): UrlReaderPredicateTuple[] => { describe('HarnessUrlReader', () => { const worker = setupServer(); setupRequestMockHandlers(worker); - + beforeAll(() => worker.listen({ onUnhandledRequest: 'bypass' })); afterAll(() => { jest.clearAllMocks(); }); diff --git a/packages/integration/src/harness/core.ts b/packages/integration/src/harness/core.ts index 324a57071c..6de8039dd5 100644 --- a/packages/integration/src/harness/core.ts +++ b/packages/integration/src/harness/core.ts @@ -122,7 +122,7 @@ export function getHarnessRequestOptions(config: HarnessIntegrationConfig): { if (apiKey) { headers['x-api-key'] = apiKey; - } else { + } else if (token) { headers.Authorization = `Bearer ${token}`; } From ed8b5324dad91129efa850a42f2d27b77b340806 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 23 Apr 2024 16:41:40 -0600 Subject: [PATCH 026/136] integration support for harness p4-fixed test Signed-off-by: Calvin Lee --- .../src/reading/HarnessUrlReader.test.ts | 136 +++++++++--------- packages/integration/src/harness/core.ts | 8 +- 2 files changed, 71 insertions(+), 73 deletions(-) diff --git a/packages/backend-common/src/reading/HarnessUrlReader.test.ts b/packages/backend-common/src/reading/HarnessUrlReader.test.ts index 18c523b959..4d43cebaec 100644 --- a/packages/backend-common/src/reading/HarnessUrlReader.test.ts +++ b/packages/backend-common/src/reading/HarnessUrlReader.test.ts @@ -25,7 +25,6 @@ import { UrlReaderPredicateTuple } from './types'; import { DefaultReadTreeResponseFactory } from './tree'; import getRawBody from 'raw-body'; import { HarnessUrlReader } from './HarnessUrlReader'; -import { NotFoundError } from '@backstage/errors'; const treeResponseFactory = DefaultReadTreeResponseFactory.create({ config: new ConfigReader({}), @@ -44,6 +43,7 @@ const harnessProcessor = new HarnessUrlReader( readHarnessConfig( new ConfigReader({ host: 'app.harness.io', + token: 'p', }), ), ), @@ -56,9 +56,60 @@ const createReader = (config: JsonObject): UrlReaderPredicateTuple[] => { treeResponseFactory, }); }; +const responseBuffer = Buffer.from('Apache License'); +const harnessApiResponse = (content: any) => { + return JSON.stringify({ + content: { + data: Buffer.from(content).toString('base64'), + encoding: 'base64', + }, + }); +}; + +const handlers = [ + rest.get( + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/content/all-apis.yaml', + (req, res, ctx) => { + return res(ctx.status(500), ctx.json({ message: 'Error!!!' })); + }, + ), + rest.get( + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/content/404error.yaml', + (req, res, ctx) => { + return res(ctx.status(404), ctx.json({ message: 'File not found.' })); + }, + ), + rest.get( + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/content/stream.TXT', + (req, res, ctx) => { + return res( + ctx.status(200), + ctx.body(harnessApiResponse(responseBuffer.toString())), + ); + }, + ), + + rest.get( + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/content/buffer.TXT', + (req, res, ctx) => { + return res( + ctx.status(200), + ctx.body(harnessApiResponse(responseBuffer.toString())), + ); + }, + ), + rest.post('/api/login', (req, res, ctx) => { + const { username } = req.body; + + if (username === 'admin') { + return res(ctx.status(200), ctx.json({ token: 'fake-token' })); + } + return res(ctx.status(403), ctx.json({ message: 'Access Denied' })); + }), +]; describe('HarnessUrlReader', () => { - const worker = setupServer(); + const worker = setupServer(...handlers); setupRequestMockHandlers(worker); beforeAll(() => worker.listen({ onUnhandledRequest: 'bypass' })); afterAll(() => { @@ -107,97 +158,40 @@ describe('HarnessUrlReader', () => { }); }); - describe('readUrl', () => { - const responseBuffer = Buffer.from('Apache License'); - const harnessApiResponse = (content: any) => { - return JSON.stringify({ - encoding: 'base64', - content: Buffer.from(content).toString('base64'), - }); - }; - - it.skip('should be able to read file contents as buffer', async () => { - worker.use( - rest.get( - 'https://app.harness.io/api/v1/repos/owner/project/contents/LICENSE', - (req, res, ctx) => { - // Test utils prefers matching URL directly but it is part of Gitea's API - if (req.url.searchParams.get('ref') === 'branch2') { - return res( - ctx.status(200), - ctx.body(harnessApiResponse(responseBuffer.toString())), - ); - } - - return res(ctx.status(500)); - }, - ), - ); - + describe('readUrl part 1', () => { + it('should be able to read file contents as buffer', async () => { const result = await harnessProcessor.readUrl( - 'https://app.harness.io/owner/project/src/branch/branch2/LICENSE', + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/buffer.TXT', ); const buffer = await result.buffer(); expect(buffer.toString()).toBe(responseBuffer.toString()); }); - it.skip('should be able to read file contents as stream', async () => { - worker.use( - rest.get( - 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/LICENSE.txt', - (req, res, ctx) => { - if (req.url.searchParams.get('ref') === 'refMain') { - return res( - ctx.status(200), - ctx.body(harnessApiResponse(responseBuffer.toString())), - ); - } - - return res(ctx.status(500)); - }, - ), - ); - + it('should be able to read file contents as stream', async () => { const result = await harnessProcessor.readUrl( - 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/LICENSE.TXT', + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/stream.TXT', ); const fromStream = await getRawBody(result.stream!()); expect(fromStream.toString()).toBe(responseBuffer.toString()); }); - it.skip('should raise NotFoundError on 404.', async () => { - worker.use( - rest.get( - 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml', - (_, res, ctx) => { - return res(ctx.status(404, 'File not found.')); - }, - ), - ); - + it('should raise NotFoundError on 404.', async () => { await expect( harnessProcessor.readUrl( - 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml', + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/404error.yaml', ), - ).rejects.toThrow(NotFoundError); + ).rejects.toThrow( + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/404error.yaml x https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/content/404error.yaml?routingId=accountId&include_commit=false&ref=refMain, 404 Not Found', + ); }); - it.skip('should throw an error on non 404 errors.', async () => { - worker.use( - rest.get( - 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml', - (_, res, ctx) => { - return res(ctx.status(500, 'Error!!!')); - }, - ), - ); - + it('should throw an error on non 404 errors.', async () => { await expect( harnessProcessor.readUrl( 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml', ), ).rejects.toThrow( - 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/content/all-apis.yaml?routingId=accountId&include_commit=false&ref=refMain, 500 Error!!!', + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml x https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/content/all-apis.yaml?routingId=accountId&include_commit=false&ref=refMain, 500 Internal Server Error', ); }); }); diff --git a/packages/integration/src/harness/core.ts b/packages/integration/src/harness/core.ts index 6de8039dd5..f762cebb56 100644 --- a/packages/integration/src/harness/core.ts +++ b/packages/integration/src/harness/core.ts @@ -93,12 +93,16 @@ export function getHarnessFileContentsUrl( _repos, repoName, _files, - ref, + _ref, _branch, ...path ] = url.replace(baseUrl, '').split('/'); + const urlParts = url.replace(baseUrl, '').split('/'); + const refAndPath = urlParts.slice(13); + const refIndex = refAndPath.findIndex(item => item === '~'); + const refString = refAndPath.slice(0, refIndex); const pathWithoutSlash = path.join('/').replace(/^\//, ''); - return `${baseUrl}/gateway/code/api/v1/repos/${accountId}/${orgName}/${projectName}/${repoName}/+/content/${pathWithoutSlash}?routingId=${accountId}&include_commit=false&ref=${ref}`; + return `${baseUrl}/gateway/code/api/v1/repos/${accountId}/${orgName}/${projectName}/${repoName}/+/content/${pathWithoutSlash}?routingId=${accountId}&include_commit=false&ref=${refString}`; } catch (e) { throw new Error(`Incorrect URL: ${url}, ${e}`); } From 0cf356671a830937d09872a933edcbc80e676841 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 23 Apr 2024 16:43:47 -0600 Subject: [PATCH 027/136] integration support for harness p4-fixed test Signed-off-by: Calvin Lee --- .../backend-common/src/reading/HarnessUrlReader.test.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/backend-common/src/reading/HarnessUrlReader.test.ts b/packages/backend-common/src/reading/HarnessUrlReader.test.ts index 4d43cebaec..5e1d2d9b2e 100644 --- a/packages/backend-common/src/reading/HarnessUrlReader.test.ts +++ b/packages/backend-common/src/reading/HarnessUrlReader.test.ts @@ -98,14 +98,6 @@ const handlers = [ ); }, ), - rest.post('/api/login', (req, res, ctx) => { - const { username } = req.body; - - if (username === 'admin') { - return res(ctx.status(200), ctx.json({ token: 'fake-token' })); - } - return res(ctx.status(403), ctx.json({ message: 'Access Denied' })); - }), ]; describe('HarnessUrlReader', () => { From 1cfa4aa35ea08f16dc7635e87a608c6e8c41851c Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 23 Apr 2024 21:13:04 -0600 Subject: [PATCH 028/136] integration support for harness p5-fixed lint Signed-off-by: Calvin Lee --- packages/backend-common/api-report.md | 3 +-- .../src/reading/HarnessUrlReader.test.ts | 8 ++++---- packages/integration/config.d.ts | 10 ++-------- packages/integration/src/harness/config.test.ts | 3 --- packages/integration/src/harness/config.ts | 3 --- 5 files changed, 7 insertions(+), 20 deletions(-) diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index 37bfda9861..33145fc47f 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -551,8 +551,7 @@ export class HarnessUrlReader implements UrlReader { // @public export type HarnessIntegrationConfig = { host: string; - baseUrl?: string; - username?: string; + apiKey?: string; token?: string; }; diff --git a/packages/backend-common/src/reading/HarnessUrlReader.test.ts b/packages/backend-common/src/reading/HarnessUrlReader.test.ts index 5e1d2d9b2e..d6cf9ab018 100644 --- a/packages/backend-common/src/reading/HarnessUrlReader.test.ts +++ b/packages/backend-common/src/reading/HarnessUrlReader.test.ts @@ -69,19 +69,19 @@ const harnessApiResponse = (content: any) => { const handlers = [ rest.get( 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/content/all-apis.yaml', - (req, res, ctx) => { + (_req, res, ctx) => { return res(ctx.status(500), ctx.json({ message: 'Error!!!' })); }, ), rest.get( 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/content/404error.yaml', - (req, res, ctx) => { + (_req, res, ctx) => { return res(ctx.status(404), ctx.json({ message: 'File not found.' })); }, ), rest.get( 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/content/stream.TXT', - (req, res, ctx) => { + (_req, res, ctx) => { return res( ctx.status(200), ctx.body(harnessApiResponse(responseBuffer.toString())), @@ -91,7 +91,7 @@ const handlers = [ rest.get( 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/content/buffer.TXT', - (req, res, ctx) => { + (_req, res, ctx) => { return res( ctx.status(200), ctx.body(harnessApiResponse(responseBuffer.toString())), diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts index 01f1f44d73..58dd9153c4 100644 --- a/packages/integration/config.d.ts +++ b/packages/integration/config.d.ts @@ -353,16 +353,10 @@ export interface Config { */ host: string; /** - * The base url for the Gitea instance. - * @visibility frontend - */ - baseUrl?: string; - - /** - * The username to use for authenticated requests. + * The apikey to use for authenticated requests. * @visibility secret */ - username?: string; + apiKey?: string; /** * Harness Code token used to authenticate requests. This can be either a generated access token. * @visibility secret diff --git a/packages/integration/src/harness/config.test.ts b/packages/integration/src/harness/config.test.ts index 4f6d8496e3..93be1fcc32 100644 --- a/packages/integration/src/harness/config.test.ts +++ b/packages/integration/src/harness/config.test.ts @@ -81,9 +81,6 @@ describe('readHarnessConfig', () => { expect(() => readHarnessConfig(buildConfig({ ...valid, host: 2 }))).toThrow( /host/, ); - expect(() => - readHarnessConfig(buildConfig({ ...valid, baseUrl: 2 })), - ).toThrow(/baseUrl/); }); it('works on the frontend', async () => { diff --git a/packages/integration/src/harness/config.ts b/packages/integration/src/harness/config.ts index 748cd141c5..2f75915567 100644 --- a/packages/integration/src/harness/config.ts +++ b/packages/integration/src/harness/config.ts @@ -44,7 +44,6 @@ export type HarnessIntegrationConfig = { */ export function readHarnessConfig(config: Config): HarnessIntegrationConfig { const host = config.getString('host'); - let baseUrl = config.getOptionalString('baseUrl'); const token = config.getOptionalString('token'); const apiKey = config.getOptionalString('apiKey'); @@ -54,8 +53,6 @@ export function readHarnessConfig(config: Config): HarnessIntegrationConfig { ); } - baseUrl = `https://${host}`; - return { host, apiKey, From 2bf97f0aa15b1940fb2a485584ae14c773cf7591 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 23 Apr 2024 21:31:44 -0600 Subject: [PATCH 029/136] integration support for harness p5-fixed check Signed-off-by: Calvin Lee --- packages/integration/package.json | 1 + yarn.lock | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/integration/package.json b/packages/integration/package.json index bbd0eecbe7..b57b94f982 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -50,6 +50,7 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/config-loader": "workspace:^", + "@backstage/test-utils": "workspace:^", "@types/luxon": "^3.0.0", "msw": "^1.0.0" }, diff --git a/yarn.lock b/yarn.lock index 3cf5a79175..60b03d4399 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4368,6 +4368,7 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/config-loader": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/test-utils": "workspace:^" "@octokit/auth-app": ^4.0.0 "@octokit/rest": ^19.0.3 "@types/luxon": ^3.0.0 From 049a69f223e9c986312750e55c4fab028398fc25 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 23 Apr 2024 21:46:58 -0600 Subject: [PATCH 030/136] integration support for harness p5-fixed api report Signed-off-by: Calvin Lee --- packages/integration/api-report.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/integration/api-report.md b/packages/integration/api-report.md index b40b66b0b6..2029dac600 100644 --- a/packages/integration/api-report.md +++ b/packages/integration/api-report.md @@ -520,9 +520,7 @@ export function getHarnessFileContentsUrl( ): string; // @public -export function getHarnessRequestOptions( - config: HarnessIntegrationConfig, -): { +export function getHarnessRequestOptions(config: HarnessIntegrationConfig): { headers?: Record; }; @@ -711,8 +709,8 @@ export class HarnessIntegration implements ScmIntegration { // @public export type HarnessIntegrationConfig = { host: string; - apiKey?: string; token?: string; + apiKey?: string; }; // @public @@ -883,9 +881,7 @@ export function readGoogleGcsIntegrationConfig( ): GoogleGcsIntegrationConfig; // @public -export function readHarnessConfig( - config: Config, -): HarnessIntegrationConfig; +export function readHarnessConfig(config: Config): HarnessIntegrationConfig; // @public @deprecated (undocumented) export const replaceGitHubUrlType: typeof replaceGithubUrlType; From 7362e25a24086d47c28c98029cb4ff982af102f5 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 23 Apr 2024 21:59:08 -0600 Subject: [PATCH 031/136] integration support for harness p5-fixed api report Signed-off-by: Calvin Lee --- packages/backend-common/api-report.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index 33145fc47f..1ae7a9dceb 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -531,6 +531,8 @@ export class GitlabUrlReader implements UrlReader { toString(): string; } +// Warning: (ae-unresolved-link) The @link reference could not be resolved: This type of declaration is not supported yet by the resolver +// // @public export class HarnessUrlReader implements UrlReader { constructor(integration: HarnessIntegration); @@ -548,13 +550,6 @@ export class HarnessUrlReader implements UrlReader { toString(): string; } -// @public -export type HarnessIntegrationConfig = { - host: string; - apiKey?: string; - token?: string; -}; - // @public export const HostDiscovery: typeof HostDiscovery_2; From a102a02c27a380513f04f8807c7eea2f5718998b Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 23 Apr 2024 22:42:20 -0600 Subject: [PATCH 032/136] integration support for harness p5-fixed api report Signed-off-by: Calvin Lee --- packages/backend-common/api-report.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index 1ae7a9dceb..e815973fb1 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -531,8 +531,6 @@ export class GitlabUrlReader implements UrlReader { toString(): string; } -// Warning: (ae-unresolved-link) The @link reference could not be resolved: This type of declaration is not supported yet by the resolver -// // @public export class HarnessUrlReader implements UrlReader { constructor(integration: HarnessIntegration); From a25b566c6453d2ad5f04e3b4a31b896a3864c797 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 23 Apr 2024 22:57:03 -0600 Subject: [PATCH 033/136] integration support for harness p5-fixed api report Signed-off-by: Calvin Lee --- packages/backend-common/src/reading/HarnessUrlReader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend-common/src/reading/HarnessUrlReader.ts b/packages/backend-common/src/reading/HarnessUrlReader.ts index 95114ae9d6..55854d102f 100644 --- a/packages/backend-common/src/reading/HarnessUrlReader.ts +++ b/packages/backend-common/src/reading/HarnessUrlReader.ts @@ -36,7 +36,7 @@ import { import { Readable } from 'stream'; /** - * Implements a {@link UrlReader} for the Harness code v1 api. + * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for the Harness code v1 api. * * @public */ From 645580361b68f525c227c9c2f5fcedc3cb89c3f2 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 23 Apr 2024 23:06:29 -0600 Subject: [PATCH 034/136] integration support for harness p5-fixed api microsite Signed-off-by: Calvin Lee --- microsite/sidebars.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 8291549153..eadcbbf806 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -239,9 +239,9 @@ "items": ["integrations/gitea/locations"] }, { - "type": "subcategory", + "type": "category", "label": "Harness", - "ids": ["integrations/harness/locations"] + "items": ["integrations/harness/locations"] }, { "type": "category", From d01f3ab8901274470ff160e3bca38d3b22372f96 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Thu, 25 Apr 2024 11:41:13 -0600 Subject: [PATCH 035/136] integration support for harness p5-fixed api microsite-fake Signed-off-by: Calvin Lee --- packages/backend-common/src/reading/HarnessUrlReader.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/backend-common/src/reading/HarnessUrlReader.ts b/packages/backend-common/src/reading/HarnessUrlReader.ts index 55854d102f..7d65e674b8 100644 --- a/packages/backend-common/src/reading/HarnessUrlReader.ts +++ b/packages/backend-common/src/reading/HarnessUrlReader.ts @@ -38,6 +38,7 @@ import { Readable } from 'stream'; /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for the Harness code v1 api. * + * * @public */ export class HarnessUrlReader implements UrlReader { From 9093f35e8aa1a99c1d7620a2ca3da6d19deeeefb Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Mon, 29 Apr 2024 12:41:19 -0600 Subject: [PATCH 036/136] integration support for harness p5-fixed api microsite-fix content api Signed-off-by: Calvin Lee --- .../src/reading/HarnessUrlReader.test.ts | 19 +++++++------------ .../src/reading/HarnessUrlReader.ts | 10 +++++----- packages/integration/src/harness/core.test.ts | 2 +- packages/integration/src/harness/core.ts | 2 +- 4 files changed, 14 insertions(+), 19 deletions(-) diff --git a/packages/backend-common/src/reading/HarnessUrlReader.test.ts b/packages/backend-common/src/reading/HarnessUrlReader.test.ts index d6cf9ab018..bb09baa140 100644 --- a/packages/backend-common/src/reading/HarnessUrlReader.test.ts +++ b/packages/backend-common/src/reading/HarnessUrlReader.test.ts @@ -58,29 +58,24 @@ const createReader = (config: JsonObject): UrlReaderPredicateTuple[] => { }; const responseBuffer = Buffer.from('Apache License'); const harnessApiResponse = (content: any) => { - return JSON.stringify({ - content: { - data: Buffer.from(content).toString('base64'), - encoding: 'base64', - }, - }); + return content; }; const handlers = [ rest.get( - 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/content/all-apis.yaml', + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/raw/all-apis.yaml', (_req, res, ctx) => { return res(ctx.status(500), ctx.json({ message: 'Error!!!' })); }, ), rest.get( - 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/content/404error.yaml', + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/raw/404error.yaml', (_req, res, ctx) => { return res(ctx.status(404), ctx.json({ message: 'File not found.' })); }, ), rest.get( - 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/content/stream.TXT', + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/raw/stream.TXT', (_req, res, ctx) => { return res( ctx.status(200), @@ -90,7 +85,7 @@ const handlers = [ ), rest.get( - 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/content/buffer.TXT', + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/:path+/raw/buffer.TXT', (_req, res, ctx) => { return res( ctx.status(200), @@ -173,7 +168,7 @@ describe('HarnessUrlReader', () => { 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/404error.yaml', ), ).rejects.toThrow( - 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/404error.yaml x https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/content/404error.yaml?routingId=accountId&include_commit=false&ref=refMain, 404 Not Found', + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/404error.yaml x https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/raw/404error.yaml?routingId=accountId&git_ref=refMain, 404 Not Found', ); }); @@ -183,7 +178,7 @@ describe('HarnessUrlReader', () => { 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml', ), ).rejects.toThrow( - 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml x https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/content/all-apis.yaml?routingId=accountId&include_commit=false&ref=refMain, 500 Internal Server Error', + 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml x https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/raw/all-apis.yaml?routingId=accountId&git_ref=refMain, 500 Internal Server Error', ); }); }); diff --git a/packages/backend-common/src/reading/HarnessUrlReader.ts b/packages/backend-common/src/reading/HarnessUrlReader.ts index 7d65e674b8..09291c5176 100644 --- a/packages/backend-common/src/reading/HarnessUrlReader.ts +++ b/packages/backend-common/src/reading/HarnessUrlReader.ts @@ -79,18 +79,18 @@ export class HarnessUrlReader implements UrlReader { } if (response.ok) { - // Harness Code returns an object with the file contents encoded, not the file itself - const jsonResponse = await response.json(); - if (jsonResponse?.content?.encoding === 'base64') { + // Harness Code returns the raw content object + const jsonResponse = { data: response.body }; + if (jsonResponse) { return ReadUrlResponseFactory.fromReadable( - Readable.from(Buffer.from(jsonResponse?.content?.data, 'base64')), + Readable.from(jsonResponse.data), { etag: response.headers.get('ETag') ?? undefined, }, ); } - throw new Error(`Unknown encoding: ${jsonResponse?.content?.encoding}`); + throw new Error(`Unknown json: ${jsonResponse}`); } const message = `${url} x ${blobUrl}, ${response.status} ${response.statusText}`; diff --git a/packages/integration/src/harness/core.test.ts b/packages/integration/src/harness/core.test.ts index 2a214cc06f..abfbb5d4c2 100644 --- a/packages/integration/src/harness/core.test.ts +++ b/packages/integration/src/harness/core.test.ts @@ -38,7 +38,7 @@ describe('Harness code core', () => { 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml', ), ).toEqual( - 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/content/all-apis.yaml?routingId=accountId&include_commit=false&ref=refMain', + 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/raw/all-apis.yaml?routingId=accountId&git_ref=refMain', ); }); }); diff --git a/packages/integration/src/harness/core.ts b/packages/integration/src/harness/core.ts index f762cebb56..8eba850ec2 100644 --- a/packages/integration/src/harness/core.ts +++ b/packages/integration/src/harness/core.ts @@ -102,7 +102,7 @@ export function getHarnessFileContentsUrl( const refIndex = refAndPath.findIndex(item => item === '~'); const refString = refAndPath.slice(0, refIndex); const pathWithoutSlash = path.join('/').replace(/^\//, ''); - return `${baseUrl}/gateway/code/api/v1/repos/${accountId}/${orgName}/${projectName}/${repoName}/+/content/${pathWithoutSlash}?routingId=${accountId}&include_commit=false&ref=${refString}`; + return `${baseUrl}/gateway/code/api/v1/repos/${accountId}/${orgName}/${projectName}/${repoName}/+/raw/${pathWithoutSlash}?routingId=${accountId}&git_ref=${refString}`; } catch (e) { throw new Error(`Incorrect URL: ${url}, ${e}`); } From 84bb2ed37df5312b0a0ed5b9195e2cd329487ec5 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 30 Apr 2024 02:57:29 -0600 Subject: [PATCH 037/136] integration support for harness - fixed comments Signed-off-by: Calvin Lee --- .changeset/empty-beers-relax.md | 2 +- .changeset/tasty-rats-explain.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/empty-beers-relax.md b/.changeset/empty-beers-relax.md index a285b9e7b4..bbfcef0933 100644 --- a/.changeset/empty-beers-relax.md +++ b/.changeset/empty-beers-relax.md @@ -2,4 +2,4 @@ '@backstage/backend-common': patch --- -This patch adds HarnessURLReader. It only supports readUrl for now. readTree and search will be implemented next. +Added `HarnessURLReader` with `readUrl` support. diff --git a/.changeset/tasty-rats-explain.md b/.changeset/tasty-rats-explain.md index aee8057915..b97ee28fef 100644 --- a/.changeset/tasty-rats-explain.md +++ b/.changeset/tasty-rats-explain.md @@ -2,4 +2,4 @@ '@backstage/integration': minor --- -This patch brings Harness Code as a valid integration via the ScmIntgration interface. It adds harness code to the relevant static properties ( get integration by name, get integration by type) for plugs to be able to reference the same harness code server +Added `HarnessIntegration` via the `ScmIntegrations` interface. From 99e6105d1e97a2e38302b6144dda1a23c1506529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 30 Apr 2024 11:27:27 +0200 Subject: [PATCH 038/136] Fix ownership card sometimes locking up for complex org structures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/wet-files-pretend.md | 5 +++++ .../Cards/OwnershipCard/useGetEntities.ts | 22 +++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 .changeset/wet-files-pretend.md diff --git a/.changeset/wet-files-pretend.md b/.changeset/wet-files-pretend.md new file mode 100644 index 0000000000..8f77a5bc0b --- /dev/null +++ b/.changeset/wet-files-pretend.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-org': patch +--- + +Fix ownership card sometimes locking up for complex org structures diff --git a/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts b/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts index e7c1f132c3..5a708bcfee 100644 --- a/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts +++ b/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts @@ -34,7 +34,7 @@ import qs from 'qs'; import { EntityRelationAggregation } from '../types'; import { uniq } from 'lodash'; -const limiter = limiterFactory(10); +const limiter = limiterFactory(5); type EntityTypeProps = { kind: string; @@ -92,10 +92,12 @@ const getChildOwnershipEntityRefs = async ( const entityRef = stringifyEntityRef(entity); if (hasChildGroups) { const entityRefs = childGroups.map(r => stringifyEntityRef(r)); - const childGroupResponse = await catalogApi.getEntitiesByRefs({ - fields: ['kind', 'metadata.namespace', 'metadata.name', 'relations'], - entityRefs, - }); + const childGroupResponse = await limiter(() => + catalogApi.getEntitiesByRefs({ + fields: ['kind', 'metadata.namespace', 'metadata.name', 'relations'], + entityRefs, + }), + ); const childGroupEntities = childGroupResponse.items.filter(isEntity); const unknownChildren = childGroupEntities.filter( @@ -107,12 +109,10 @@ const getChildOwnershipEntityRefs = async ( const childrenRefs = ( await Promise.all( unknownChildren.map(childGroupEntity => - limiter(() => - getChildOwnershipEntityRefs(childGroupEntity, catalogApi, [ - ...alreadyRetrievedParentRefs, - entityRef, - ]), - ), + getChildOwnershipEntityRefs(childGroupEntity, catalogApi, [ + ...alreadyRetrievedParentRefs, + entityRef, + ]), ), ) ).flatMap(aggregated => aggregated); From 015149cffde95f1cdf282841639422975862a510 Mon Sep 17 00:00:00 2001 From: Marley <55280588+marleypowell@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:09:40 +0000 Subject: [PATCH 039/136] fix: added `eventsServiceFactory` to `defaultServiceFactories` Signed-off-by: Marley <55280588+marleypowell@users.noreply.github.com> --- packages/backend-defaults/package.json | 29 ++++++++++--------- .../backend-defaults/src/CreateBackend.ts | 2 ++ packages/backend-test-utils/package.json | 1 + .../src/next/services/mockServices.ts | 12 ++++++++ .../src/next/wiring/TestBackend.ts | 1 + plugins/events-node/src/index.ts | 2 +- plugins/events-node/src/service.ts | 29 ++++++++++--------- 7 files changed, 47 insertions(+), 29 deletions(-) diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 8b061b15f4..d2c86e46c8 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,5 +1,6 @@ { "name": "@backstage/backend-defaults", + "version": "0.2.17", "description": "Backend defaults used by Backstage backend apps", "version": "0.2.18-next.0", "main": "src/index.ts", @@ -9,38 +10,38 @@ "main": "dist/index.cjs.js", "types": "dist/index.d.ts" }, - "backstage": { - "role": "node-library" - }, + "keywords": [ + "backstage" + ], "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", "directory": "packages/backend-defaults" }, - "keywords": [ - "backstage" - ], "license": "Apache-2.0", + "main": "src/index.ts", + "types": "src/index.ts", + "files": [ + "dist" + ], "scripts": { "build": "backstage-cli package build", + "clean": "backstage-cli package clean", "lint": "backstage-cli package lint", - "test": "backstage-cli package test", "prepack": "backstage-cli package prepack", "postpack": "backstage-cli package postpack", - "clean": "backstage-cli package clean", - "start": "backstage-cli package start" + "start": "backstage-cli package start", + "test": "backstage-cli package test" }, "dependencies": { "@backstage/backend-app-api": "workspace:^", - "@backstage/backend-common": "workspace:^" + "@backstage/backend-common": "workspace:^", + "@backstage/plugin-events-node": "workspace:^" }, "devDependencies": { "@backstage/backend-plugin-api": "workspace:^", "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^" - }, - "files": [ - "dist" - ] + } } diff --git a/packages/backend-defaults/src/CreateBackend.ts b/packages/backend-defaults/src/CreateBackend.ts index 5495665dd8..e9bdc03262 100644 --- a/packages/backend-defaults/src/CreateBackend.ts +++ b/packages/backend-defaults/src/CreateBackend.ts @@ -36,6 +36,7 @@ import { httpAuthServiceFactory, userInfoServiceFactory, } from '@backstage/backend-app-api'; +import { eventsServiceFactory } from '@backstage/plugin-events-node'; export const defaultServiceFactories = [ authServiceFactory(), @@ -56,6 +57,7 @@ export const defaultServiceFactories = [ tokenManagerServiceFactory(), userInfoServiceFactory(), urlReaderServiceFactory(), + eventsServiceFactory(), ]; /** diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 1d43e24adf..e252d267da 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -51,6 +51,7 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", + "@backstage/plugin-events-node": "workspace:^", "@backstage/types": "workspace:^", "better-sqlite3": "^9.0.0", "cookie": "^0.6.0", diff --git a/packages/backend-test-utils/src/next/services/mockServices.ts b/packages/backend-test-utils/src/next/services/mockServices.ts index a858bf7dbf..05b3ae927c 100644 --- a/packages/backend-test-utils/src/next/services/mockServices.ts +++ b/packages/backend-test-utils/src/next/services/mockServices.ts @@ -52,6 +52,10 @@ import { MockAuthService } from './MockAuthService'; import { MockHttpAuthService } from './MockHttpAuthService'; import { mockCredentials } from './mockCredentials'; import { MockUserInfoService } from './MockUserInfoService'; +import { + eventsServiceFactory, + eventsServiceRef, +} from '@backstage/plugin-events-node'; /** @internal */ function simpleFactory< @@ -397,4 +401,12 @@ export namespace mockServices { search: jest.fn(), })); } + + export namespace events { + export const factory = eventsServiceFactory; + export const mock = simpleMock(eventsServiceRef, () => ({ + publish: jest.fn(), + subscribe: jest.fn(), + })); + } } diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index 10041dce4f..e43353991f 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -83,6 +83,7 @@ export const defaultServiceFactories = [ mockServices.tokenManager.factory(), mockServices.userInfo.factory(), mockServices.urlReader.factory(), + mockServices.events.factory(), ]; /** diff --git a/plugins/events-node/src/index.ts b/plugins/events-node/src/index.ts index 2bd93a8aea..643ba7f79e 100644 --- a/plugins/events-node/src/index.ts +++ b/plugins/events-node/src/index.ts @@ -22,4 +22,4 @@ export * from './api'; export * from './deprecated'; -export { eventsServiceRef } from './service'; +export { eventsServiceRef, eventsServiceFactory } from './service'; diff --git a/plugins/events-node/src/service.ts b/plugins/events-node/src/service.ts index e1d3047fca..af0e562c80 100644 --- a/plugins/events-node/src/service.ts +++ b/plugins/events-node/src/service.ts @@ -30,18 +30,19 @@ import { EventsService, DefaultEventsService } from './api'; export const eventsServiceRef = createServiceRef({ id: 'events.service', scope: 'plugin', - defaultFactory: async service => - createServiceFactory({ - service, - deps: { - pluginMetadata: coreServices.pluginMetadata, - rootLogger: coreServices.rootLogger, - }, - async createRootContext({ rootLogger }) { - return DefaultEventsService.create({ logger: rootLogger }); - }, - async factory({ pluginMetadata }, eventsService) { - return eventsService.forPlugin(pluginMetadata.getId()); - }, - }), +}); + +/** @public */ +export const eventsServiceFactory = createServiceFactory({ + service: eventsServiceRef, + deps: { + pluginMetadata: coreServices.pluginMetadata, + rootLogger: coreServices.rootLogger, + }, + async createRootContext({ rootLogger }) { + return DefaultEventsService.create({ logger: rootLogger }); + }, + async factory({ pluginMetadata }, eventsService) { + return eventsService.forPlugin(pluginMetadata.getId()); + }, }); From 7e5a50d446cd9474f3befe3e2ea88ea8e4e14800 Mon Sep 17 00:00:00 2001 From: Marley <55280588+marleypowell@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:12:20 +0000 Subject: [PATCH 040/136] added changeset Signed-off-by: Marley <55280588+marleypowell@users.noreply.github.com> --- .changeset/quick-cats-argue.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/quick-cats-argue.md diff --git a/.changeset/quick-cats-argue.md b/.changeset/quick-cats-argue.md new file mode 100644 index 0000000000..956f038f34 --- /dev/null +++ b/.changeset/quick-cats-argue.md @@ -0,0 +1,7 @@ +--- +'@backstage/backend-test-utils': patch +'@backstage/backend-defaults': patch +'@backstage/plugin-events-node': patch +--- + +added `eventsServiceFactory` to `defaultServiceFactories` to resolve issue where different instances of the EventsServices could be used From f8b04f61f516b35ec74b44b6d38c4527812b0dc2 Mon Sep 17 00:00:00 2001 From: Marley <55280588+marleypowell@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:15:19 +0000 Subject: [PATCH 041/136] updated yarn.lock Signed-off-by: Marley <55280588+marleypowell@users.noreply.github.com> --- yarn.lock | 2 ++ 1 file changed, 2 insertions(+) diff --git a/yarn.lock b/yarn.lock index 3cf5a79175..e4c522b43f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3432,6 +3432,7 @@ __metadata: "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" + "@backstage/plugin-events-node": "workspace:^" languageName: unknown linkType: soft @@ -3550,6 +3551,7 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" + "@backstage/plugin-events-node": "workspace:^" "@backstage/types": "workspace:^" "@types/supertest": ^2.0.8 better-sqlite3: ^9.0.0 From 58cc659d9997fa056cf92b64ff6dcbd7483395f6 Mon Sep 17 00:00:00 2001 From: Marley <55280588+marleypowell@users.noreply.github.com> Date: Tue, 30 Apr 2024 09:31:03 +0000 Subject: [PATCH 042/136] Merge remote-tracking branch 'upstream/master' into marley/provide-default-events-factory Signed-off-by: Marley <55280588+marleypowell@users.noreply.github.com> From 26a2c2bcfbd7f978844a2e9d43cddf71aad27933 Mon Sep 17 00:00:00 2001 From: Marley <55280588+marleypowell@users.noreply.github.com> Date: Tue, 30 Apr 2024 09:35:13 +0000 Subject: [PATCH 043/136] rebase fix Signed-off-by: Marley <55280588+marleypowell@users.noreply.github.com> --- packages/backend-defaults/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index d2c86e46c8..acfabf2779 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,10 +1,10 @@ { "name": "@backstage/backend-defaults", - "version": "0.2.17", - "description": "Backend defaults used by Backstage backend apps", "version": "0.2.18-next.0", - "main": "src/index.ts", - "types": "src/index.ts", + "description": "Backend defaults used by Backstage backend apps", + "backstage": { + "role": "node-library" + }, "publishConfig": { "access": "public", "main": "dist/index.cjs.js", From e6d20965104df029822a176fc7586f87fac5733a Mon Sep 17 00:00:00 2001 From: Marley <55280588+marleypowell@users.noreply.github.com> Date: Tue, 30 Apr 2024 09:40:57 +0000 Subject: [PATCH 044/136] rebase fix Signed-off-by: Marley <55280588+marleypowell@users.noreply.github.com> --- packages/backend-defaults/package.json | 32 +++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index acfabf2779..d9ac8dcdb3 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,38 +1,35 @@ { "name": "@backstage/backend-defaults", - "version": "0.2.18-next.0", "description": "Backend defaults used by Backstage backend apps", - "backstage": { - "role": "node-library" - }, + "version": "0.2.18-next.0", + "main": "src/index.ts", + "types": "src/index.ts", "publishConfig": { "access": "public", "main": "dist/index.cjs.js", "types": "dist/index.d.ts" }, - "keywords": [ - "backstage" - ], + "backstage": { + "role": "node-library" + }, "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", "directory": "packages/backend-defaults" }, - "license": "Apache-2.0", - "main": "src/index.ts", - "types": "src/index.ts", - "files": [ - "dist" + "keywords": [ + "backstage" ], + "license": "Apache-2.0", "scripts": { "build": "backstage-cli package build", - "clean": "backstage-cli package clean", "lint": "backstage-cli package lint", + "test": "backstage-cli package test", "prepack": "backstage-cli package prepack", "postpack": "backstage-cli package postpack", - "start": "backstage-cli package start", - "test": "backstage-cli package test" + "clean": "backstage-cli package clean", + "start": "backstage-cli package start" }, "dependencies": { "@backstage/backend-app-api": "workspace:^", @@ -43,5 +40,8 @@ "@backstage/backend-plugin-api": "workspace:^", "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^" - } + }, + "files": [ + "dist" + ] } From 0a63f600a999b6aab2a3425a325c22e2578d6e3f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 30 Apr 2024 11:52:23 +0200 Subject: [PATCH 045/136] remove GOVERNANCE.md Signed-off-by: Patrik Oldsberg --- GOVERNANCE.md | 233 ------------------ OWNERS.md | 2 +- docs/faq/technical.md | 2 +- ...021-06-22-spotify-backstage-is-growing.mdx | 4 +- microsite/blog/2023-04-26-kubecon-eu-2023.mdx | 2 +- .../blog/2024-04-19-community-plugins.mdx | 2 +- 6 files changed, 6 insertions(+), 239 deletions(-) delete mode 100644 GOVERNANCE.md diff --git a/GOVERNANCE.md b/GOVERNANCE.md deleted file mode 100644 index 2367dab99c..0000000000 --- a/GOVERNANCE.md +++ /dev/null @@ -1,233 +0,0 @@ -# Project Areas - -The Backstage project is divided into several project areas, each covering particular parts of the project. The main driver for each area is ownership of code in the main Backstage repository, as well as other repositories in the Backstage GitHub organization. Each area has a set of maintainers and repository content that they own. There may be no overlap in ownership between areas, which means that any given line in the GitHub code owners file should have only one owner specified. Each area is represented by a team in the Backstage GitHub organization. Apart from certain project-wide concerns, such as the release process, each area is self-governing and chooses their own ways of working. Project areas may also have special interest groups (SIGs) related to their area, but this is not required. - -The project areas as well as their maintainers are listed in the [OWNERS.md](./OWNERS.md) file. - -Each project area must have at least one maintainer. Project area maintainers may have shared ownership with the core maintainers, which in that case is considered an incubating area. The project area maintainers help drive work forward in the area, but they might not yet feel ready to take on ownership. The goal should generally be that these project area maintainers eventually become sole maintainers of the project area. This is to allow for a more smooth onboarding and transition of ownership, where members of the community might for example be new to open source maintainership. - -## Adding new project areas - -Project areas are added by nominating new maintainers for that area. See the sections for becoming a [Project Area Maintainer](#project-area-maintainer). - -Project areas may also by added by splitting existing areas. Every area that is created through this process must have at least one maintainer. - -## Removing project areas - -Project areas are removed by removing all maintainers for that area and removing the corresponding team from the Backstage GitHub organization. The project area can be re-added later if there is a need for it. Reasons for removal may include lack of activity, lack of maintainers, or lack of relevance to the project. - -# Project Roles - -## Contributor - -A Contributor contributes directly to the project and adds value to it. Contributions need not be code. People at the Contributor level may be new contributors, or they may only contribute occasionally. - -### Responsibilities - -- Follow the [CNCF CoC](https://github.com/cncf/foundation/blob/main/code-of-conduct.md) -- Follow the project [contributing guide](CONTRIBUTING.md) - -### How to get involved - -- Participate in community discussions -- Help other users -- Submit bug reports -- Comment on issues -- Try out new releases -- Attend community events - -### How to contribute - -- Report and sometimes resolve issues -- Occasionally submit PRs -- Contribute to the documentation -- Show up at meetings, take notes -- Answer questions from other community members -- Submit feedback on issues and PRs -- Test releases and patches and submit reviews -- Run or help run events -- Promote the project in public - -## Organization Member - -An org member is a frequent contributor that has become a member of the Backstage GitHub organization. In addition to the responsibilities of contributors, an org member is also expected to be reasonably active in the community through continuous contributions of any type. - -An Organization Member must meet the responsibilities and has the requirements of a Contributor. - -### Responsibilities - -- Continues to contribute regularly, as demonstrated by having at least 10 GitHub contributions per year in [Devstats](https://backstage.devstats.cncf.io/d/48/users-statistics-by-repository-group?orgId=1&var-period=y&var-metric=contributions&var-repogroup_name=All&from=now-1y&to=now&var-users=All), or contributions of a similar effort that might not be captured in Devstats. - -### Requirements - -- Must have at least 10 contributions to the projects in the form of: - - Accepted PRs - - Helpful PR reviews - - Resolving GitHub issues - - Or some equivalent contributions to the project -- Must have been contributing for at least 3 months -- Or is the member of a team that owns a project area, in which case the above requirements do not apply and the member is instead vetted by the project area maintainers - -### Becoming an Organization Member - -Open an issue towards [the community repository](https://github.com/backstage/community) using the [org membership request template](https://github.com/backstage/community/issues/new?template=org_member.yaml&title=Org+Member%3A+%3Cyour-github-login%3E). - -### Privileges - -- Membership in the Backstage GitHub organization - -## Plugin Maintainer - -A Plugin Maintainer is responsible for maintaining an individual Backstage plugin or module. This includes reviewing contributions and responding to issues towards an individual plugin, as well as keeping the plugin up to date. - -Plugin Maintainer is a lightweight form of ownership that is primarily reflected though code owners of the plugin packages in the [CODEOWNERS](./.github/CODEOWNERS) file. Each plugin can have one or more maintainers. If a plugin becomes a significant part of the Backstage ecosystem, it may be promoted to be a distinct project area instead. - -A Plugin Maintainer has all the rights and responsibilities of an Organization Member. - -### Responsibilities - -- Review the majority of PRs towards the plugin -- Respond to GitHub issues related to the plugin -- Keep the plugin up-to-date with Backstage libraries and other dependencies -- Follow the [reviewing guide](REVIEWING.md) - -### Requirements - -- Is an Organization Member -- Display knowledge of Backstage's review process and best practices for plugin design -- Is supportive of new and occasional contributors and helps get useful PRs in shape to merge - -### Privileges - -- GitHub code owner of the plugin directory, with rights to approve and merge PRs towards the plugin - -### Becoming a Plugin Maintainer - -To become a Plugin Maintainer, you first need to be an Organization Member. You can then file a pull request towards [CODEOWNERS.md](./.github/CODEOWNERS) requesting to be added as a code owner of the plugin directory. Existing code owners of that plugin alongside the core maintainers will then review the request. - -## Project Area Maintainer - -Project Area Maintainers are owners of a particular project area. They are expected to review and merge pull requests towards their area, and also drive development and manage tech health. A Project Area Maintainer also need to commit a certain number of hours per month towards the project, and exercise judgment for the good of the project, independent of their employer. Project Area Maintainers should also mentor new maintainers and participate in and lead community meetings related to their area. New Project Area Maintainers need to be approved by the existing project area maintainers, or the core maintainers if it is a new area. - -The maintainers of a project area may be represented by a team in external organization. In this case, the state as a project area maintainer is tied to the membership in that team. New members of the team may automatically be added as maintainers, as well as removed when they leave. This process is governed autonomously by the team of project area maintainers. - -A Project Area Maintainer has all the rights and responsibilities of an Organization Member. - -### Responsibilities - -- Review PRs towards their project area. Project area maintainers are expected to review at least 20 PRs per year, or the majority of all PRs towards the area, if it is less than 20 -- Follow the [reviewing guide](REVIEWING.md) -- Triage and respond to issues related to their project area -- Mentor new project area maintainers -- Write refactoring PRs -- Determine strategy and policy for the project area -- Participate in or leading community meetings related to their project area - -### Requirements - -- Is an Organization Member -- Have made at least 5 meaningful contributions towards the project area -- Demonstrates knowledge of their project area, and how it fits into the larger Backstage project -- Is able to exercise judgment for the good of the project, independent of their employer, friends, or team -- Mentors other contributors and project area maintainers -- Can commit to spending at least 16 hours per month working on the project, preferably distributed evenly across the month - -### Privileges - -- Approve and merge PRs towards their project area -- Drive the direction and roadmap of their project area - -### Becoming a Project Area Maintainer - -If you are interested in becoming a project area maintainer, reach out to the existing maintainers for that area. If you wish to become a maintainer for a new area, reach out to the core maintainers. - -Any current project area maintainer or core maintainer may nominate a new project area maintainer by opening a PR towards the [OWNERS.md](OWNERS.md) file. A majority of the project area maintainers for that area must approve the PR. If there are no existing maintainers for that area, the PR must be approved by a majority of the core maintainers. - -## Core Maintainer - -Core Maintainers are responsible for the Backstage project as a whole. They help review and merge project-level pull requests as well as coordinate work affecting multiple project areas. A core maintainer needs to commit the majority of their working time towards the project, and exercise judgment for the good of the project, independent of their employer. Core maintainers should also mentor and seek out new maintainers, lead community meetings, and communicate with the CNCF on behalf of the project. To become a core maintainer one needs to have been the maintainer of a number of different project areas, demonstrate a deep knowledge of large parts of the Backstage project, and be backed by the existing core maintainers. - -A Core Maintainer have all the rights and responsibilities of a Project Area Maintainer. - -### Responsibilities - -- Take part in the incoming issue and PR triage and review process. PRs are shared equally among all maintainers -- Mentor new Project Area Maintainers and Plugin Maintainers -- Drive refactoring and manage tech health across the entire project -- Participate in CNCF maintainer activities -- Respond to security incidents in accordance to our [security policy](./SECURITY.md) -- Determine strategy and policy for the project -- Participate in or leading community meetings - -### Requirements - -- Experience as a Project Area Maintainer for at least 6 months -- Demonstrates a broad knowledge of the project across multiple areas -- Is able to exercise judgment for the good of the project, independent of their employer, friends, or team -- Mentors other contributors -- Can commit to spending at least 10 days per month working on the project - -### Privileges - -- Approve PRs that fall outside any specific project area -- Merge PRs to any area of the project -- Represent the project in public as a Maintainer -- Communicate with the CNCF on behalf of the project -- Have a vote in Maintainer decision-making meetings - -### Becoming a Core Maintainer - -Any core maintainer or end user sponsor may nominate a new core maintainer by opening a PR towards the [OWNERS.md](OWNERS.md) file. Core maintainers must be approved by a majority of the existing core maintainers and end user sponsors. - -## End User Sponsors - -### Role of a Backstage End User Sponsor - -- Provide support for Backstage by removing blockers, securing funding, providing advocacy, feedback, and ensuring project continuity and long term success -- Assist Backstage maintainers in prioritizing upcoming roadmap items and planned work -- Provide neutral mediation for any disputes that arise as part of the project - -### Backstage End User Sponsor Membership - -The End User Sponsors group comprises at most 5 people. To be eligible for membership in the group, you or the company where you work you must: - -- Be responsible for and end user of a production Backstage deployment of non-trivial size -- Be active contributors to the open source project -- Be willing and able to attend regularly-scheduled End User Sponsor meetings -- Abide by [CNCF CoC](https://github.com/cncf/foundation/blob/main/code-of-conduct.md) - -Candidates for membership will be nominated by current Sponsor members or by Backstage maintainers. If there are more nominations than Sponsor seats remaining, existing sponsors shall vote on the candidates, and the candidates with the most votes will become Sponsors. Any ties will be broken by current Backstage sponsors. - -# Conflict resolution and voting - -In general, we prefer that technical issues and membership are amicably worked out between the persons involved. If a dispute cannot be decided independently, the sponsors and core maintainers can be called in to decide an issue. If the sponsors and maintainers themselves cannot decide an issue, the issue will be resolved by voting. - -In all cases in this document where voting is mentioned, the voting process is a simple majority in which each sponsor receives two votes and each core maintainer receives one vote. If such a majority is reached, the vote is said to have _passed_. - -## Inactivity - -It is important for contributors to be and stay active to set an example and show commitment to the project. Inactivity is harmful to the project as it may lead to unexpected delays, contributor attrition, and a loss of trust in the project. - -Inactivity is measured by periods of no contributions without explanation, for longer than: - -- Core Maintainer: 2 months -- Project Area Maintainer: 4 months -- Plugin Maintainer: 6 months -- Organization Member: 12 months - -Consequences of being inactive include: - -- Involuntary removal or demotion -- Being asked to move to Emeritus status - -## Involuntary Removal or Demotion - -Involuntary removal/demotion of a contributor happens when responsibilities and requirements aren't being met. This may include repeated patterns of inactivity, extended period of inactivity, a period of failing to meet the requirements of your role, and/or a violation of the Code of Conduct. This process is important because it protects the community and its deliverables while also opens up opportunities for new contributors to step in. - -Involuntary removal or demotion is handled through a vote by a majority of the current Core Maintainers. Some aspects of this process may be automated, such as removal after periods of inactivity. - -## Stepping Down/Emeritus Process - -If and when contributors' commitment levels change, contributors can consider stepping down (moving down the contributor ladder) vs moving to emeritus status (completely stepping away from the project). - -Contact the Maintainers about changing to Emeritus status, or reducing your contributor level. diff --git a/OWNERS.md b/OWNERS.md index ab35b5b1e5..d8967ca873 100644 --- a/OWNERS.md +++ b/OWNERS.md @@ -1,5 +1,5 @@ - See [CONTRIBUTING.md](CONTRIBUTING.md) for general contribution guidelines. -- See [GOVERNANCE.md](GOVERNANCE.md) for governance guidelines and responsibilities. +- See [GOVERNANCE.md](https://github.com/backstage/community/blob/main/GOVERNANCE.md) for governance guidelines and responsibilities. ## Core Maintainers diff --git a/docs/faq/technical.md b/docs/faq/technical.md index ffd99dadcd..d64d81d499 100644 --- a/docs/faq/technical.md +++ b/docs/faq/technical.md @@ -154,7 +154,7 @@ maintains Backstage in your own environment. For more information, see our [Owners](https://github.com/backstage/backstage/blob/master/OWNERS.md) and -[Governance](https://github.com/backstage/backstage/blob/master/GOVERNANCE.md). +[Governance](https://github.com/backstage/community/blob/main/GOVERNANCE.md). ### Does Spotify provide a managed version of Backstage? diff --git a/microsite/blog/2021-06-22-spotify-backstage-is-growing.mdx b/microsite/blog/2021-06-22-spotify-backstage-is-growing.mdx index 6cae5c907e..308effaeab 100644 --- a/microsite/blog/2021-06-22-spotify-backstage-is-growing.mdx +++ b/microsite/blog/2021-06-22-spotify-backstage-is-growing.mdx @@ -66,9 +66,9 @@ Speaking of reviewers and maintainers… ## Adding reviewers and maintainers -[![GitHub logo](assets/21-06-22/gh-reviewers.png)](https://github.com/backstage/backstage/blob/master/GOVERNANCE.md#reviewers) +[![GitHub logo](assets/21-06-22/gh-reviewers.png)](https://github.com/backstage/community/blob/main/GOVERNANCE.md#reviewers) -We have introduced [reviewers](https://github.com/backstage/backstage/blob/master/GOVERNANCE.md#reviewers) to the project! By adding this new role, we’ve expanded the number of people who are permitted to approve and merge pull requests. This will offload some of the review work from the maintainers, simplifying and speeding up the review process for contributors. +We have introduced [reviewers](https://github.com/backstage/community/blob/main/GOVERNANCE.md#reviewers) to the project! By adding this new role, we’ve expanded the number of people who are permitted to approve and merge pull requests. This will offload some of the review work from the maintainers, simplifying and speeding up the review process for contributors. Of course, with these new efforts, we expect even more companies to adopt Backstage, which means the platform will continue to grow, and the number of PRs will continue to grow with it. As that happens, we hope to add to both the maintainer and reviewer teams in the future. diff --git a/microsite/blog/2023-04-26-kubecon-eu-2023.mdx b/microsite/blog/2023-04-26-kubecon-eu-2023.mdx index 7ee549c088..8f369c2d14 100644 --- a/microsite/blog/2023-04-26-kubecon-eu-2023.mdx +++ b/microsite/blog/2023-04-26-kubecon-eu-2023.mdx @@ -21,7 +21,7 @@ On Tuesday the Backstage maintainers hosted a jam-packed project meeting. The co ![Patrik and Ben onstage for the State of Backstage talk](assets/2023-04-26/IMG_0120.png) -Core maintainers [Ben Lambert](https://github.com/benjdlambert) and [Patrik Oldsberg](https://github.com/Rugvip) took center stage on Wednesday for the Backstage Maintainer Track: State of Backstage in 2023 talk. Backstage has officially hit over 1,000 adopters and 1,000 contributors – so it’s apt timing to modernize the governance model for the project. Taking pointers from the [CNCF Contributor Ladder Governance Template](https://contribute.cncf.io/maintainers/templates/), a new [Backstage Governance Model](https://github.com/backstage/backstage/blob/master/GOVERNANCE.md) is now in effect! Patrik walked us through the new ladder model which introduces a number of changes, one being the addition of [project area maintainers](https://github.com/backstage/backstage/blob/master/GOVERNANCE.md#project-area-maintainer). This role lets members of the community take increased ownership over a specific area of interest, like Catalog, Discoverability, TechDocs, Helm Charts, and Kubernetes. New project areas that will be added include Permissions and Software Templates. New project areas can be proposed by nominating a project area maintainer for the area. The new model also adds an organization member role for contributors who want to take a more active role in the Backstage community. You can open an issue to become an organization member [here](https://github.com/backstage/community/issues/new/choose). +Core maintainers [Ben Lambert](https://github.com/benjdlambert) and [Patrik Oldsberg](https://github.com/Rugvip) took center stage on Wednesday for the Backstage Maintainer Track: State of Backstage in 2023 talk. Backstage has officially hit over 1,000 adopters and 1,000 contributors – so it’s apt timing to modernize the governance model for the project. Taking pointers from the [CNCF Contributor Ladder Governance Template](https://contribute.cncf.io/maintainers/templates/), a new [Backstage Governance Model](https://github.com/backstage/community/blob/main/GOVERNANCE.md) is now in effect! Patrik walked us through the new ladder model which introduces a number of changes, one being the addition of [project area maintainers](https://github.com/backstage/community/blob/main/GOVERNANCE.md#project-area-maintainer). This role lets members of the community take increased ownership over a specific area of interest, like Catalog, Discoverability, TechDocs, Helm Charts, and Kubernetes. New project areas that will be added include Permissions and Software Templates. New project areas can be proposed by nominating a project area maintainer for the area. The new model also adds an organization member role for contributors who want to take a more active role in the Backstage community. You can open an issue to become an organization member [here](https://github.com/backstage/community/issues/new/choose). ![Contributor ladder](assets/2023-04-26/contributor_ladder.png) diff --git a/microsite/blog/2024-04-19-community-plugins.mdx b/microsite/blog/2024-04-19-community-plugins.mdx index bb8b9c2313..49d1765bce 100644 --- a/microsite/blog/2024-04-19-community-plugins.mdx +++ b/microsite/blog/2024-04-19-community-plugins.mdx @@ -14,7 +14,7 @@ For those who depended on these plugins, migrating is as simple as `yarn backsta ## The community plugins repo -Some of you who have been around a while, or have seen our [Maintainer Track talks](https://www.youtube.com/watch?v=ONMBYnhxnNU) at KubeCon, might have seen [this RFC](https://github.com/backstage/backstage/issues/20266) which outlines some issues with the scale of the `backstage/backstage` monorepo, and us as maintainers being the de facto owners of all plugins without a [project area](https://github.com/backstage/backstage/blob/master/GOVERNANCE.md#project-area) or [plugin maintainer](https://github.com/backstage/backstage/blob/master/GOVERNANCE.md#project-area-maintainer). +Some of you who have been around a while, or have seen our [Maintainer Track talks](https://www.youtube.com/watch?v=ONMBYnhxnNU) at KubeCon, might have seen [this RFC](https://github.com/backstage/backstage/issues/20266) which outlines some issues with the scale of the `backstage/backstage` monorepo, and us as maintainers being the de facto owners of all plugins without a [project area](https://github.com/backstage/community/blob/main/GOVERNANCE.md#project-area) or [plugin maintainer](https://github.com/backstage/community/blob/main/GOVERNANCE.md#project-area-maintainer). There was some great discussion in this issue, and some great ideas. One of the ideas was to create a dedicated home for community plugins, with all the burden of release tooling and workspace tooling already set up, which is a pretty big barrier for people wanting to create plugins for Backstage in their own organization or personal account. These plugins would then have the ability to release independently of the main monorepo, and have their own release cadence, which is something that we've been looking at exploring for a while. From e4b50ab39bce59b285bc93838e3946b2d18503c3 Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Tue, 30 Apr 2024 21:10:30 +0200 Subject: [PATCH 046/136] Scaffolder workspace serialization Signed-off-by: bnechyporenko --- .changeset/healthy-dots-ring.md | 6 + plugins/scaffolder-backend/api-report.md | 22 ++++ .../migrations/20240401213200_workspace.js | 35 ++++++ plugins/scaffolder-backend/package.json | 2 + .../src/scaffolder/tasks/DatabaseTaskStore.ts | 26 ++++ .../tasks/NunjucksWorkflowRunner.ts | 13 +- .../src/scaffolder/tasks/StorageTaskBroker.ts | 16 +++ .../src/scaffolder/tasks/serializer.test.ts | 111 ++++++++++++++++++ .../src/scaffolder/tasks/serializer.ts | 39 ++++++ .../src/scaffolder/tasks/types.ts | 13 ++ plugins/scaffolder-node/api-report.md | 4 + plugins/scaffolder-node/src/tasks/types.ts | 7 ++ yarn.lock | 2 + 13 files changed, 292 insertions(+), 4 deletions(-) create mode 100644 .changeset/healthy-dots-ring.md create mode 100644 plugins/scaffolder-backend/migrations/20240401213200_workspace.js create mode 100644 plugins/scaffolder-backend/src/scaffolder/tasks/serializer.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/tasks/serializer.ts diff --git a/.changeset/healthy-dots-ring.md b/.changeset/healthy-dots-ring.md new file mode 100644 index 0000000000..005e7e6616 --- /dev/null +++ b/.changeset/healthy-dots-ring.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-scaffolder-node': patch +--- + +Scaffolder workspace serialization diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 6af1ac04a6..b9bf44b34f 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -3,6 +3,8 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +/// + import { ActionContext as ActionContext_2 } from '@backstage/plugin-scaffolder-node'; import { AuthService } from '@backstage/backend-plugin-api'; import * as azure from '@backstage/plugin-scaffolder-backend-module-azure'; @@ -370,6 +372,8 @@ export interface CurrentClaimedTask { spec: TaskSpec; state?: JsonObject; taskId: string; + // (undocumented) + workspace?: Promise; } // @public @@ -414,6 +418,8 @@ export class DatabaseTaskStore implements TaskStore { | undefined >; // (undocumented) + getWorkspace?(options: { taskId: string }): Promise; + // (undocumented) heartbeatTask(taskId: string): Promise; // (undocumented) list(options: { createdBy?: string }): Promise<{ @@ -437,6 +443,8 @@ export class DatabaseTaskStore implements TaskStore { // (undocumented) saveTaskState(options: { taskId: string; state?: JsonObject }): Promise; // (undocumented) + serializeWorkspace(options: { path: string; taskId: string }): Promise; + // (undocumented) shutdownTask(options: TaskStoreShutDownTaskOptions): Promise; } @@ -554,10 +562,14 @@ export class TaskManager implements TaskContext_2 { | undefined >; // (undocumented) + getWorkspace(options: { taskId: string }): Promise; + // (undocumented) getWorkspaceName(): Promise; // (undocumented) get secrets(): TaskSecrets_2 | undefined; // (undocumented) + serializeWorkspace?(options: { path: string }): Promise; + // (undocumented) get spec(): TaskSpecV1beta3; // (undocumented) updateCheckpoint?( @@ -609,6 +621,8 @@ export interface TaskStore { | undefined >; // (undocumented) + getWorkspace?(options: { taskId: string }): Promise; + // (undocumented) heartbeatTask(taskId: string): Promise; // (undocumented) list?(options: { createdBy?: string }): Promise<{ @@ -634,6 +648,14 @@ export interface TaskStore { state?: JsonObject; }): Promise; // (undocumented) + serializeWorkspace?({ + path, + taskId, + }: { + path: string; + taskId: string; + }): Promise; + // (undocumented) shutdownTask?(options: TaskStoreShutDownTaskOptions): Promise; } diff --git a/plugins/scaffolder-backend/migrations/20240401213200_workspace.js b/plugins/scaffolder-backend/migrations/20240401213200_workspace.js new file mode 100644 index 0000000000..175de54cd9 --- /dev/null +++ b/plugins/scaffolder-backend/migrations/20240401213200_workspace.js @@ -0,0 +1,35 @@ +/* + * 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. + */ + +// @ts-check + +/** + * @param {import('knex').Knex} knex + */ +exports.up = async function up(knex) { + await knex.schema.alterTable('tasks', table => { + table.binary('workspace').nullable().comment('A snapshot of the workspace'); + }); +}; + +/** + * @param {import('knex').Knex} knex + */ +exports.down = async function down(knex) { + await knex.schema.alterTable('tasks', table => { + table.dropColumn('workspace'); + }); +}; diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index d107d578cb..aef07c731f 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -78,6 +78,7 @@ "@backstage/types": "workspace:^", "@types/express": "^4.17.6", "@types/luxon": "^3.0.0", + "concat-stream": "^2.0.0", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", @@ -93,6 +94,7 @@ "p-limit": "^3.1.0", "p-queue": "^6.6.2", "prom-client": "^15.0.0", + "tar": "^6.1.12", "uuid": "^9.0.0", "winston": "^3.2.1", "winston-transport": "^4.7.0", diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index ac391ea2b6..7c6606a1a2 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -42,6 +42,7 @@ import { DateTime, Duration } from 'luxon'; import { TaskRecovery, TaskSpec } from '@backstage/plugin-scaffolder-common'; import { trimEventsTillLastRecovery } from './taskRecoveryHelper'; import { intervalFromNowTill } from './dbUtil'; +import { restoreWorkspace, serializeWorkspace } from './serializer'; const migrationsDir = resolvePackagePath( '@backstage/plugin-scaffolder-backend', @@ -57,6 +58,7 @@ export type RawDbTaskRow = { created_at: string; created_by: string | null; secrets?: string | null; + workspace?: Buffer; }; export type RawDbTaskEventRow = { @@ -509,6 +511,30 @@ export class DatabaseTaskStore implements TaskStore { }); } + async rehydrateWorkspace?(options: { + taskId: string; + targetPath: string; + }): Promise { + const [result] = await this.db('tasks') + .where({ id: options.taskId }) + .select('workspace'); + + await restoreWorkspace(options.targetPath, result.workspace); + } + + async serializeWorkspace(options: { + path: string; + taskId: string; + }): Promise { + if (options.path) { + await this.db('tasks') + .where({ id: options.taskId }) + .update({ + workspace: await serializeWorkspace(options.path), + }); + } + } + async cancelTask( options: TaskStoreEmitOptions<{ message: string } & JsonObject>, ): Promise { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 5d24ac7cc7..decb05ad88 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -419,6 +419,8 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { reason: stringifyError(err), }); throw err; + } finally { + await task.serializeWorkspace?.({ path: workspacePath }); } }, createTemporaryDirectory: async () => { @@ -460,6 +462,8 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { await taskTrack.markFailed(step, err); await stepTrack.markFailed(); throw err; + } finally { + await task.serializeWorkspace?.({ path: workspacePath }); } } @@ -469,10 +473,9 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { 'Wrong template version executed with the workflow engine', ); } - const workspacePath = path.join( - this.options.workingDirectory, - await task.getWorkspaceName(), - ); + const taskId = await task.getWorkspaceName(); + + const workspacePath = path.join(this.options.workingDirectory, taskId); const { additionalTemplateFilters, additionalTemplateGlobals } = this.options; @@ -486,6 +489,8 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { }); try { + await task.rehydrateWorkspace?.({ taskId, targetPath: workspacePath }); + const taskTrack = await this.tracker.taskStart(task); await fs.ensureDir(workspacePath); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index e9a408d9d6..51f3afc623 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -99,6 +99,13 @@ export class TaskManager implements TaskContext { return this.task.taskId; } + async rehydrateWorkspace(options: { + taskId: string; + targetPath: string; + }): Promise { + return this.storage.rehydrateWorkspace?.(options); + } + get done() { return this.isDone; } @@ -144,6 +151,13 @@ export class TaskManager implements TaskContext { }); } + async serializeWorkspace?(options: { path: string }): Promise { + await this.storage.serializeWorkspace?.({ + path: options.path, + taskId: this.task.taskId, + }); + } + async complete( result: TaskCompletionState, metadata?: JsonObject, @@ -219,6 +233,8 @@ export interface CurrentClaimedTask { * The creator of the task. */ createdBy?: string; + + workspace?: Promise; } function defer() { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/serializer.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/serializer.test.ts new file mode 100644 index 0000000000..bec5398e28 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/serializer.test.ts @@ -0,0 +1,111 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { serializeWorkspace, restoreWorkspace } from './serializer'; +import { createMockDirectory } from '@backstage/backend-test-utils'; +import fs from 'fs-extra'; + +describe('serializer', () => { + const workspaceDir = createMockDirectory({ + content: { + 'app-config.yaml': ` + app: + title: Example App + sessionKey: + $file: secrets/session-key.txt + escaped: \$\${Escaped} + `, + 'app-config2.yaml': ` + app: + title: Example App 2 + sessionKey: + $file: secrets/session-key.txt + escaped: \$\${Escaped} + `, + 'app-config.development.yaml': ` + app: + sessionKey: development-key + backend: + $include: ./included.yaml + other: + $include: secrets/included.yaml + `, + 'secrets/session-key.txt': 'abc123', + 'secrets/included.yaml': ` + secret: + $file: session-key.txt + `, + 'included.yaml': ` + foo: + bar: token \${MY_SECRET} + `, + 'app-config.substitute.yaml': ` + app: + someConfig: + $include: \${SUBSTITUTE_ME}.yaml + noSubstitute: + $file: \$\${ESCAPE_ME}.txt + `, + 'substituted.yaml': ` + secret: + $file: secrets/\${SUBSTITUTE_ME}.txt + `, + 'secrets/substituted.txt': '123abc', + '${ESCAPE_ME}.txt': 'notSubstituted', + 'empty.yaml': '# just a comment', + }, + }); + + const restoredWorkspaceDir = createMockDirectory(); + + it('should be able to archive and restore the workspace', async () => { + const workspaceBuffer = await serializeWorkspace(workspaceDir.path); + await restoreWorkspace(restoredWorkspaceDir.path, workspaceBuffer); + + expect( + fs.existsSync(`${restoredWorkspaceDir.path}/\$\{ESCAPE_ME\}.txt`), + ).toBeTruthy(); + expect( + fs.existsSync(`${restoredWorkspaceDir.path}/app-config.development.yaml`), + ).toBeTruthy(); + expect( + fs.existsSync(`${restoredWorkspaceDir.path}/app-config.substitute.yaml`), + ).toBeTruthy(); + expect( + fs.existsSync(`${restoredWorkspaceDir.path}/app-config.yaml`), + ).toBeTruthy(); + expect( + fs.existsSync(`${restoredWorkspaceDir.path}/app-config2.yaml`), + ).toBeTruthy(); + expect( + fs.existsSync(`${restoredWorkspaceDir.path}/empty.yaml`), + ).toBeTruthy(); + expect( + fs.existsSync(`${restoredWorkspaceDir.path}/included.yaml`), + ).toBeTruthy(); + expect(fs.existsSync(`${restoredWorkspaceDir.path}/secrets`)).toBeTruthy(); + expect( + fs.existsSync(`${restoredWorkspaceDir.path}/substituted.yaml`), + ).toBeTruthy(); + + expect( + fs.readFileSync(`${restoredWorkspaceDir.path}/substituted.yaml`, 'utf8'), + ).toEqual(` + secret: + $file: secrets/\${SUBSTITUTE_ME}.txt + `); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/serializer.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/serializer.ts new file mode 100644 index 0000000000..69c48fb769 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/serializer.ts @@ -0,0 +1,39 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import tar from 'tar'; +import concatStream from 'concat-stream'; +import { promisify } from 'util'; +import { pipeline as pipelineCb, Readable } from 'stream'; + +const pipeline = promisify(pipelineCb); + +export const serializeWorkspace = async (path: string): Promise => { + return await new Promise(async resolve => { + await pipeline(tar.create({ cwd: path }, ['']), concatStream(resolve)); + }); +}; + +export const restoreWorkspace = async (path: string, buffer?: Buffer) => { + if (buffer) { + await pipeline( + Readable.from(buffer), + tar.extract({ + C: path, + }), + ); + } +}; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index aa647d8bd6..676b7e8c3a 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -211,6 +211,19 @@ export interface TaskStore { ): Promise<{ events: SerializedTaskEvent[] }>; shutdownTask?(options: TaskStoreShutDownTaskOptions): Promise; + + rehydrateWorkspace?(options: { + taskId: string; + targetPath: string; + }): Promise; + + serializeWorkspace?({ + path, + taskId, + }: { + path: string; + taskId: string; + }): Promise; } export type WorkflowResponse = { output: { [key: string]: JsonValue } }; diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index c757301249..7211dbcb28 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -361,12 +361,16 @@ export interface TaskContext { | undefined >; // (undocumented) + getWorkspace?(options: { taskId: string }): Promise; + // (undocumented) getWorkspaceName(): Promise; // (undocumented) isDryRun?: boolean; // (undocumented) secrets?: TaskSecrets; // (undocumented) + serializeWorkspace?(options: { path: string }): Promise; + // (undocumented) spec: TaskSpec; // (undocumented) updateCheckpoint?( diff --git a/plugins/scaffolder-node/src/tasks/types.ts b/plugins/scaffolder-node/src/tasks/types.ts index aef2c5f360..b2da5b2f0f 100644 --- a/plugins/scaffolder-node/src/tasks/types.ts +++ b/plugins/scaffolder-node/src/tasks/types.ts @@ -141,6 +141,13 @@ export interface TaskContext { }, ): Promise; + serializeWorkspace?(options: { path: string }): Promise; + + rehydrateWorkspace?(options: { + taskId: string; + targetPath: string; + }): Promise; + getWorkspaceName(): Promise; getInitiatorCredentials(): Promise; diff --git a/yarn.lock b/yarn.lock index 3cf5a79175..e9a7947795 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6788,6 +6788,7 @@ __metadata: "@types/nunjucks": ^3.1.4 "@types/supertest": ^2.0.8 "@types/zen-observable": ^0.8.0 + concat-stream: ^2.0.0 esbuild: ^0.20.0 express: ^4.17.1 express-promise-router: ^4.1.0 @@ -6806,6 +6807,7 @@ __metadata: prom-client: ^15.0.0 strip-ansi: ^7.1.0 supertest: ^6.1.3 + tar: ^6.1.12 uuid: ^9.0.0 wait-for-expect: ^3.0.2 winston: ^3.2.1 From ee538cb044075ea4dc0b4266e8f03285ee13c03b Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Tue, 30 Apr 2024 21:13:35 +0200 Subject: [PATCH 047/136] Scaffolder workspace serialization Signed-off-by: bnechyporenko --- plugins/scaffolder-backend/api-report.md | 21 +++++++++++++++------ plugins/scaffolder-node/api-report.md | 7 +++++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index b9bf44b34f..38ee521b38 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -418,8 +418,6 @@ export class DatabaseTaskStore implements TaskStore { | undefined >; // (undocumented) - getWorkspace?(options: { taskId: string }): Promise; - // (undocumented) heartbeatTask(taskId: string): Promise; // (undocumented) list(options: { createdBy?: string }): Promise<{ @@ -441,6 +439,11 @@ export class DatabaseTaskStore implements TaskStore { ids: string[]; }>; // (undocumented) + rehydrateWorkspace?(options: { + taskId: string; + targetPath: string; + }): Promise; + // (undocumented) saveTaskState(options: { taskId: string; state?: JsonObject }): Promise; // (undocumented) serializeWorkspace(options: { path: string; taskId: string }): Promise; @@ -562,10 +565,13 @@ export class TaskManager implements TaskContext_2 { | undefined >; // (undocumented) - getWorkspace(options: { taskId: string }): Promise; - // (undocumented) getWorkspaceName(): Promise; // (undocumented) + rehydrateWorkspace(options: { + taskId: string; + targetPath: string; + }): Promise; + // (undocumented) get secrets(): TaskSecrets_2 | undefined; // (undocumented) serializeWorkspace?(options: { path: string }): Promise; @@ -621,8 +627,6 @@ export interface TaskStore { | undefined >; // (undocumented) - getWorkspace?(options: { taskId: string }): Promise; - // (undocumented) heartbeatTask(taskId: string): Promise; // (undocumented) list?(options: { createdBy?: string }): Promise<{ @@ -643,6 +647,11 @@ export interface TaskStore { ids: string[]; }>; // (undocumented) + rehydrateWorkspace?(options: { + taskId: string; + targetPath: string; + }): Promise; + // (undocumented) saveTaskState?(options: { taskId: string; state?: JsonObject; diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index 7211dbcb28..a6b91bdccb 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -361,12 +361,15 @@ export interface TaskContext { | undefined >; // (undocumented) - getWorkspace?(options: { taskId: string }): Promise; - // (undocumented) getWorkspaceName(): Promise; // (undocumented) isDryRun?: boolean; // (undocumented) + rehydrateWorkspace?(options: { + taskId: string; + targetPath: string; + }): Promise; + // (undocumented) secrets?: TaskSecrets; // (undocumented) serializeWorkspace?(options: { path: string }): Promise; From 84cdb92346785ceffda429fa64e35d7a6bce94cf Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 30 Apr 2024 13:20:34 -0600 Subject: [PATCH 048/136] integration support for harness - fixed comments p2 Signed-off-by: Calvin Lee --- packages/integration/package.json | 1 - packages/integration/src/harness/core.test.ts | 16 ++++++++-------- packages/integration/src/harness/core.ts | 4 ---- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/packages/integration/package.json b/packages/integration/package.json index b57b94f982..bbd0eecbe7 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -50,7 +50,6 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/config-loader": "workspace:^", - "@backstage/test-utils": "workspace:^", "@types/luxon": "^3.0.0", "msw": "^1.0.0" }, diff --git a/packages/integration/src/harness/core.test.ts b/packages/integration/src/harness/core.test.ts index abfbb5d4c2..d3d402806a 100644 --- a/packages/integration/src/harness/core.test.ts +++ b/packages/integration/src/harness/core.test.ts @@ -15,7 +15,7 @@ */ import { setupServer } from 'msw/node'; -import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { setupRequestMockHandlers } from '../helpers'; import { HarnessIntegrationConfig } from './config'; import { getHarnessEditContentsUrl, @@ -59,26 +59,26 @@ describe('Harness code core', () => { }); }); - describe('getGerritRequestOptions', () => { + describe('getHarnessRequestOptions', () => { it('adds token header when only a token is specified', () => { const authRequest: HarnessIntegrationConfig = { - host: 'gerrit.com', + host: 'app.harness.io', token: 'P', }; const anonymousRequest: HarnessIntegrationConfig = { - host: 'gerrit.com', + host: 'app.harness.io', }; expect( (getHarnessRequestOptions(authRequest).headers as any).Authorization, ).toEqual('Bearer P'); - expect( - getHarnessRequestOptions(anonymousRequest).headers, - ).toBeUndefined(); + expect(getHarnessRequestOptions(anonymousRequest).headers).toStrictEqual( + {}, + ); }); it('adds basic auth when apikey and token are specified', () => { const authRequest: HarnessIntegrationConfig = { - host: 'gerrit.com', + host: 'app.harness.io', token: 'P', apiKey: 'a', }; diff --git a/packages/integration/src/harness/core.ts b/packages/integration/src/harness/core.ts index 8eba850ec2..3a61905e27 100644 --- a/packages/integration/src/harness/core.ts +++ b/packages/integration/src/harness/core.ts @@ -120,10 +120,6 @@ export function getHarnessRequestOptions(config: HarnessIntegrationConfig): { const headers: Record = {}; const { token, apiKey } = config; - if (!token) { - return headers; - } - if (apiKey) { headers['x-api-key'] = apiKey; } else if (token) { From 677b10650b806d743e0f6ad1b2718fb11d8cf3c5 Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Tue, 30 Apr 2024 13:23:30 -0600 Subject: [PATCH 049/136] integration support for harness - fixed comments p2 Signed-off-by: Calvin Lee --- yarn.lock | 1 - 1 file changed, 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 60b03d4399..3cf5a79175 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4368,7 +4368,6 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/config-loader": "workspace:^" "@backstage/errors": "workspace:^" - "@backstage/test-utils": "workspace:^" "@octokit/auth-app": ^4.0.0 "@octokit/rest": ^19.0.3 "@types/luxon": ^3.0.0 From 425b403bb212a4b8fd41a0a5dfdffcc32c7e9058 Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Tue, 30 Apr 2024 21:28:55 +0200 Subject: [PATCH 050/136] Scaffolder workspace serialization Signed-off-by: bnechyporenko --- .../tasks/DatabaseTaskStore.test.ts | 32 +++++++++++++++++++ .../src/scaffolder/tasks/DatabaseTaskStore.ts | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts index ab80dcff04..f4fae0715b 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts @@ -19,6 +19,8 @@ import { ConfigReader } from '@backstage/config'; import { DatabaseTaskStore } from './DatabaseTaskStore'; import { TaskSpec } from '@backstage/plugin-scaffolder-common'; import { ConflictError } from '@backstage/errors'; +import { createMockDirectory } from '@backstage/backend-test-utils'; +import fs from 'fs-extra'; const createStore = async () => { const manager = DatabaseManager.fromConfig( @@ -37,6 +39,18 @@ const createStore = async () => { return { store, manager }; }; +const workspaceDir = createMockDirectory({ + content: { + 'app-config.yaml': ` + app: + title: Example App + sessionKey: + $file: secrets/session-key.txt + escaped: \$\${Escaped} + `, + }, +}); + describe('DatabaseTaskStore', () => { it('should create the database store and run migration', async () => { const { store, manager } = await createStore(); @@ -259,4 +273,22 @@ describe('DatabaseTaskStore', () => { }, }); }); + + it('serialize and restore the workspace', async () => { + const { store } = await createStore(); + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + + await store.serializeWorkspace({ path: workspaceDir.path, taskId }); + expect(fs.existsSync(`${workspaceDir.path}/app-config.yaml`)).toBeTruthy(); + + fs.removeSync(workspaceDir.path); + expect(fs.existsSync(`${workspaceDir.path}/app-config.yaml`)).toBeFalsy(); + + fs.mkdirSync(workspaceDir.path); + await store.rehydrateWorkspace({ targetPath: workspaceDir.path, taskId }); + expect(fs.existsSync(`${workspaceDir.path}/app-config.yaml`)).toBeTruthy(); + }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 7c6606a1a2..792b74e8d2 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -511,7 +511,7 @@ export class DatabaseTaskStore implements TaskStore { }); } - async rehydrateWorkspace?(options: { + async rehydrateWorkspace(options: { taskId: string; targetPath: string; }): Promise { From 8ed3cd6fb715fbf8fd8fa9ea871beb1f058cdbd0 Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Wed, 1 May 2024 07:40:33 +0200 Subject: [PATCH 051/136] Scaffolder workspace serialization Signed-off-by: bnechyporenko --- plugins/scaffolder-backend/api-report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 38ee521b38..3ef21f4c98 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -439,7 +439,7 @@ export class DatabaseTaskStore implements TaskStore { ids: string[]; }>; // (undocumented) - rehydrateWorkspace?(options: { + rehydrateWorkspace(options: { taskId: string; targetPath: string; }): Promise; From f1ee6899c91d0561ae750d5b0a82826c6458b2bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 15:23:27 +0000 Subject: [PATCH 052/136] chore(deps): bump ejs from 3.1.9 to 3.1.10 Bumps [ejs](https://github.com/mde/ejs) from 3.1.9 to 3.1.10. - [Release notes](https://github.com/mde/ejs/releases) - [Commits](https://github.com/mde/ejs/compare/v3.1.9...v3.1.10) --- updated-dependencies: - dependency-name: ejs dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3cf5a79175..f50de49dfc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22872,13 +22872,13 @@ __metadata: linkType: hard "ejs@npm:^3.1.6": - version: 3.1.9 - resolution: "ejs@npm:3.1.9" + version: 3.1.10 + resolution: "ejs@npm:3.1.10" dependencies: jake: ^10.8.5 bin: ejs: bin/cli.js - checksum: af6f10eb815885ff8a8cfacc42c6b6cf87daf97a4884f87a30e0c3271fedd85d76a3a297d9c33a70e735b97ee632887f85e32854b9cdd3a2d97edf931519a35f + checksum: ce90637e9c7538663ae023b8a7a380b2ef7cc4096de70be85abf5a3b9641912dde65353211d05e24d56b1f242d71185c6d00e02cb8860701d571786d92c71f05 languageName: node linkType: hard From 503d769eb972b9ad96ee9e941ae446b3608c34fd Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Thu, 2 May 2024 13:12:13 +0300 Subject: [PATCH 053/136] feat: add new scaffolder action to send notifications Signed-off-by: Heikki Hellgren --- .changeset/new-poets-promise.md | 5 + .github/CODEOWNERS | 1 + packages/backend/package.json | 1 + .../.eslintrc.js | 1 + .../README.md | 5 + .../api-report.md | 32 ++++ .../catalog-info.yaml | 10 ++ .../package.json | 45 ++++++ .../src/actions/index.ts | 16 ++ .../src/actions/sendNotification.test.ts | 93 +++++++++++ .../src/actions/sendNotification.ts | 146 ++++++++++++++++++ .../src/index.ts | 23 +++ .../src/module.ts | 39 +++++ yarn.lock | 16 ++ 14 files changed, 433 insertions(+) create mode 100644 .changeset/new-poets-promise.md create mode 100644 plugins/scaffolder-backend-module-notifications/.eslintrc.js create mode 100644 plugins/scaffolder-backend-module-notifications/README.md create mode 100644 plugins/scaffolder-backend-module-notifications/api-report.md create mode 100644 plugins/scaffolder-backend-module-notifications/catalog-info.yaml create mode 100644 plugins/scaffolder-backend-module-notifications/package.json create mode 100644 plugins/scaffolder-backend-module-notifications/src/actions/index.ts create mode 100644 plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.test.ts create mode 100644 plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.ts create mode 100644 plugins/scaffolder-backend-module-notifications/src/index.ts create mode 100644 plugins/scaffolder-backend-module-notifications/src/module.ts diff --git a/.changeset/new-poets-promise.md b/.changeset/new-poets-promise.md new file mode 100644 index 0000000000..206bf3e0d8 --- /dev/null +++ b/.changeset/new-poets-promise.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-notifications': patch +--- + +Add a new scaffolder action to allow sending notifications from templates diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9fc63fbd04..9cd3bc0690 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -61,6 +61,7 @@ yarn.lock @backstage/maintainers @backst /plugins/linguist-common @backstage/maintainers @backstage/reviewers @awanlin /plugins/notifications @backstage/maintainers @backstage/notifications-maintainers /plugins/notifications-* @backstage/maintainers @backstage/notifications-maintainers +/plugins/scaffolder-backend-module-notifications @backstage/maintainers @backstage/notifications-maintainers /plugins/octopus-deploy @backstage/maintainers @backstage/reviewers @jmezach /plugins/permission-* @backstage/permission-maintainers /plugins/playlist @backstage/maintainers @backstage/reviewers @kuangp diff --git a/packages/backend/package.json b/packages/backend/package.json index ea37121492..7f42df6681 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -50,6 +50,7 @@ "@backstage/plugin-scaffolder-backend": "workspace:^", "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "workspace:^", "@backstage/plugin-scaffolder-backend-module-gitlab": "workspace:^", + "@backstage/plugin-scaffolder-backend-module-notifications": "workspace:^", "@backstage/plugin-scaffolder-backend-module-rails": "workspace:^", "@backstage/plugin-search-backend": "workspace:^", "@backstage/plugin-search-backend-module-catalog": "workspace:^", diff --git a/plugins/scaffolder-backend-module-notifications/.eslintrc.js b/plugins/scaffolder-backend-module-notifications/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/scaffolder-backend-module-notifications/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/scaffolder-backend-module-notifications/README.md b/plugins/scaffolder-backend-module-notifications/README.md new file mode 100644 index 0000000000..49a363a994 --- /dev/null +++ b/plugins/scaffolder-backend-module-notifications/README.md @@ -0,0 +1,5 @@ +# @backstage/plugin-scaffolder-backend-module-notifications + +The notifications backend module for the scaffolder plugin. + +_This plugin was created through the Backstage CLI_ diff --git a/plugins/scaffolder-backend-module-notifications/api-report.md b/plugins/scaffolder-backend-module-notifications/api-report.md new file mode 100644 index 0000000000..8b12210fe9 --- /dev/null +++ b/plugins/scaffolder-backend-module-notifications/api-report.md @@ -0,0 +1,32 @@ +## API Report File for "@backstage/plugin-scaffolder-backend-module-notifications" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; +import { NotificationService } from '@backstage/plugin-notifications-node'; +import { NotificationSeverity } from '@backstage/plugin-notifications-common'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; + +// @public (undocumented) +export function createSendNotificationAction(options: { + notifications: NotificationService; +}): TemplateAction< + { + recipients: string; + entityRefs?: string[] | undefined; + title: string; + info?: string | undefined; + link?: string | undefined; + severity?: NotificationSeverity | undefined; + scope?: string | undefined; + optional?: boolean | undefined; + }, + JsonObject +>; + +// @public +const scaffolderModuleNotifications: () => BackendFeature; +export default scaffolderModuleNotifications; +``` diff --git a/plugins/scaffolder-backend-module-notifications/catalog-info.yaml b/plugins/scaffolder-backend-module-notifications/catalog-info.yaml new file mode 100644 index 0000000000..640cd1ad6f --- /dev/null +++ b/plugins/scaffolder-backend-module-notifications/catalog-info.yaml @@ -0,0 +1,10 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-plugin-scaffolder-backend-module-notifications + title: '@backstage/plugin-scaffolder-backend-module-notifications' + description: The notifications module for @backstage/plugin-scaffolder-backend +spec: + lifecycle: experimental + type: backstage-backend-plugin-module + owner: maintainers diff --git a/plugins/scaffolder-backend-module-notifications/package.json b/plugins/scaffolder-backend-module-notifications/package.json new file mode 100644 index 0000000000..11974049a1 --- /dev/null +++ b/plugins/scaffolder-backend-module-notifications/package.json @@ -0,0 +1,45 @@ +{ + "name": "@backstage/plugin-scaffolder-backend-module-notifications", + "version": "0.0.0", + "description": "The notifications backend module for the scaffolder plugin.", + "backstage": { + "role": "backend-plugin-module" + }, + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/scaffolder-backend-module-notifications" + }, + "license": "Apache-2.0", + "main": "src/index.ts", + "types": "src/index.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "backstage-cli package build", + "clean": "backstage-cli package clean", + "lint": "backstage-cli package lint", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "start": "backstage-cli package start", + "test": "backstage-cli package test" + }, + "dependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/plugin-notifications-common": "workspace:^", + "@backstage/plugin-notifications-node": "workspace:^", + "@backstage/plugin-scaffolder-node": "workspace:^", + "octokit": "^3.0.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/plugin-scaffolder-node-test-utils": "workspace:^" + } +} diff --git a/plugins/scaffolder-backend-module-notifications/src/actions/index.ts b/plugins/scaffolder-backend-module-notifications/src/actions/index.ts new file mode 100644 index 0000000000..9d708282dd --- /dev/null +++ b/plugins/scaffolder-backend-module-notifications/src/actions/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2024 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 { createSendNotificationAction } from './sendNotification'; diff --git a/plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.test.ts b/plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.test.ts new file mode 100644 index 0000000000..efd1377cae --- /dev/null +++ b/plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.test.ts @@ -0,0 +1,93 @@ +/* + * Copyright 2024 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 { createSendNotificationAction } from './sendNotification'; +import { NotificationService } from '@backstage/plugin-notifications-node'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; +import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils'; + +describe('notification:send', () => { + const notificationService: jest.Mocked = { + send: jest.fn(), + }; + + let action: TemplateAction; + + beforeEach(() => { + jest.resetAllMocks(); + action = createSendNotificationAction({ + notifications: notificationService, + }); + }); + + const mockContext = createMockActionContext({ + input: { + recipients: 'broadcast', + title: 'Test notification', + }, + }); + + it('should send broadcast notification', async () => { + const ctx = Object.assign({}, mockContext, { + input: { recipients: 'broadcast', title: 'Test notification' }, + }); + await action.handler(ctx); + expect(notificationService.send).toHaveBeenCalledWith({ + recipients: { type: 'broadcast' }, + payload: { + title: 'Test notification', + }, + }); + }); + + it('should send entity notification', async () => { + const ctx = Object.assign({}, mockContext, { + input: { + recipients: 'entity', + entityRefs: ['user:default/john.doe'], + title: 'Test notification', + }, + }); + await action.handler(ctx); + expect(notificationService.send).toHaveBeenCalledWith({ + recipients: { type: 'entity', entityRef: ['user:default/john.doe'] }, + payload: { + title: 'Test notification', + }, + }); + }); + + it('should throw error if entity refs are missing', async () => { + const ctx = Object.assign({}, mockContext, { + input: { + recipients: 'entity', + title: 'Test notification', + }, + }); + await expect(action.handler(ctx)).rejects.toThrow(); + }); + + it('should not throw error if entity refs are missing but optional is true', async () => { + const ctx = Object.assign({}, mockContext, { + input: { + recipients: 'entity', + title: 'Test notification', + optional: true, + }, + }); + await expect(action.handler(ctx)).resolves.not.toThrow(); + expect(notificationService.send).not.toHaveBeenCalled(); + }); +}); diff --git a/plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.ts b/plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.ts new file mode 100644 index 0000000000..f50e178174 --- /dev/null +++ b/plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.ts @@ -0,0 +1,146 @@ +/* + * Copyright 2024 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 { + NotificationRecipients, + NotificationService, +} from '@backstage/plugin-notifications-node'; +import { + NotificationPayload, + NotificationSeverity, +} from '@backstage/plugin-notifications-common'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; + +/** + * @public + */ +export function createSendNotificationAction(options: { + notifications: NotificationService; +}) { + const { notifications } = options; + return createTemplateAction<{ + recipients: string; + entityRefs?: string[]; + title: string; + info?: string; + link?: string; + severity?: NotificationSeverity; + scope?: string; + optional?: boolean; + }>({ + id: 'notification:send', + description: 'Sends a notification using NotificationService', + schema: { + input: { + type: 'object', + required: ['recipients', 'title'], + properties: { + recipients: { + title: 'Recipient', + enum: ['broadcast', 'entity'], + description: + 'The recipient of the notification, either broadcast or entity. If using entity, also entityRef must be provided', + type: 'string', + }, + entityRefs: { + title: 'Entity references', + description: + 'The entity references to send the notification to, required if using recipient of entity', + type: 'array', + items: { + type: 'string', + }, + }, + title: { + title: 'Title', + description: 'Notification title', + type: 'string', + }, + info: { + title: 'Description', + description: 'Notification description', + type: 'string', + }, + link: { + title: 'Link', + description: 'Notification link', + type: 'string', + }, + severity: { + title: 'Severity', + type: 'string', + description: `Notification severity`, + enum: ['low', 'normal', 'high', 'critical'], + }, + scope: { + title: 'Scope', + description: 'Notification scope', + type: 'string', + }, + optional: { + title: 'Optional', + description: + 'Do not fail the action if the notification sending fails', + type: 'boolean', + }, + }, + }, + }, + async handler(ctx) { + const { + recipients, + entityRefs, + title, + info, + link, + severity, + scope, + optional, + } = ctx.input; + + ctx.logger.info(`Sending notification to ${recipients}`); + if (recipients === 'entity' && !entityRefs) { + if (optional !== true) { + throw new Error('Entity references must be provided'); + } + return; + } + + const notificationRecipients: NotificationRecipients = + recipients === 'broadcast' + ? { type: 'broadcast' } + : { type: 'entity', entityRef: entityRefs! }; + const payload: NotificationPayload = { + title, + description: info, + link, + severity, + scope, + }; + + try { + await notifications.send({ + recipients: notificationRecipients, + payload, + }); + } catch (e) { + ctx.logger.error(`Failed to send notification: ${e}`); + if (optional !== true) { + throw e; + } + } + }, + }); +} diff --git a/plugins/scaffolder-backend-module-notifications/src/index.ts b/plugins/scaffolder-backend-module-notifications/src/index.ts new file mode 100644 index 0000000000..05a356cc71 --- /dev/null +++ b/plugins/scaffolder-backend-module-notifications/src/index.ts @@ -0,0 +1,23 @@ +/* + * Copyright 2024 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. + */ + +/** + * The notifications backend module for the scaffolder plugin. + * + * @packageDocumentation + */ +export * from './actions'; +export { scaffolderModuleNotifications as default } from './module'; diff --git a/plugins/scaffolder-backend-module-notifications/src/module.ts b/plugins/scaffolder-backend-module-notifications/src/module.ts new file mode 100644 index 0000000000..e8b6823e99 --- /dev/null +++ b/plugins/scaffolder-backend-module-notifications/src/module.ts @@ -0,0 +1,39 @@ +/* + * Copyright 2024 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 { createBackendModule } from '@backstage/backend-plugin-api'; +import { notificationService } from '@backstage/plugin-notifications-node'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { createSendNotificationAction } from './actions'; + +/** + * @public + * The Notifications module for the Scaffolder Backend + */ +export const scaffolderModuleNotifications = createBackendModule({ + pluginId: 'scaffolder', + moduleId: 'notifications', + register(reg) { + reg.registerInit({ + deps: { + notifications: notificationService, + scaffolder: scaffolderActionsExtensionPoint, + }, + async init({ notifications, scaffolder }) { + scaffolder.addActions(createSendNotificationAction({ notifications })); + }, + }); + }, +}); diff --git a/yarn.lock b/yarn.lock index 3cf5a79175..f46996d52f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6695,6 +6695,21 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-scaffolder-backend-module-notifications@workspace:^, @backstage/plugin-scaffolder-backend-module-notifications@workspace:plugins/scaffolder-backend-module-notifications": + version: 0.0.0-use.local + resolution: "@backstage/plugin-scaffolder-backend-module-notifications@workspace:plugins/scaffolder-backend-module-notifications" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/plugin-notifications-common": "workspace:^" + "@backstage/plugin-notifications-node": "workspace:^" + "@backstage/plugin-scaffolder-node": "workspace:^" + "@backstage/plugin-scaffolder-node-test-utils": "workspace:^" + octokit: ^3.0.0 + languageName: unknown + linkType: soft + "@backstage/plugin-scaffolder-backend-module-rails@workspace:^, @backstage/plugin-scaffolder-backend-module-rails@workspace:plugins/scaffolder-backend-module-rails": version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-rails@workspace:plugins/scaffolder-backend-module-rails" @@ -24249,6 +24264,7 @@ __metadata: "@backstage/plugin-scaffolder-backend": "workspace:^" "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "workspace:^" "@backstage/plugin-scaffolder-backend-module-gitlab": "workspace:^" + "@backstage/plugin-scaffolder-backend-module-notifications": "workspace:^" "@backstage/plugin-scaffolder-backend-module-rails": "workspace:^" "@backstage/plugin-search-backend": "workspace:^" "@backstage/plugin-search-backend-module-catalog": "workspace:^" From 483a4f9425336091f53f79a6d6037a12dfba3f01 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 2 May 2024 13:59:48 +0200 Subject: [PATCH 054/136] microsite/data: update plugin link Signed-off-by: Patrik Oldsberg --- microsite/data/plugins/betterscan.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/data/plugins/betterscan.yaml b/microsite/data/plugins/betterscan.yaml index 92d1eaa7b2..852ae0081c 100644 --- a/microsite/data/plugins/betterscan.yaml +++ b/microsite/data/plugins/betterscan.yaml @@ -4,7 +4,7 @@ author: Marcin Kozlowski authorUrl: https://betterscan.io category: Security description: View security scanned vulnerabilities in Code and Cloud scanned using Open Source and proprietary scanners directly in Backstage. -documentation: https://github.com/marcinguy/betterscan-ce +documentation: https://www.npmjs.com/package/@marcinguy/backstage-plugin-betterscan iconUrl: https://uploads-ssl.webflow.com/6339e3b81867539b5fe2498d/633a1643dcb06d3029867161_g4.svg npmPackageName: '@marcinguy/backstage-plugin-betterscan' addedDate: '2022-12-08' From 9814aa6dd420d28075a68f0423e800c5100a527f Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Wed, 1 May 2024 07:43:34 -0500 Subject: [PATCH 055/136] Updated GitHub Integrations Docs Signed-off-by: Andre Wanlin --- docs/integrations/github/discovery--old.md | 376 +++++++++++++++++++++ docs/integrations/github/discovery.md | 175 +--------- docs/integrations/github/org--old.md | 368 ++++++++++++++++++++ docs/integrations/github/org.md | 332 ++++++------------ 4 files changed, 858 insertions(+), 393 deletions(-) create mode 100644 docs/integrations/github/discovery--old.md create mode 100644 docs/integrations/github/org--old.md diff --git a/docs/integrations/github/discovery--old.md b/docs/integrations/github/discovery--old.md new file mode 100644 index 0000000000..b94cb256c4 --- /dev/null +++ b/docs/integrations/github/discovery--old.md @@ -0,0 +1,376 @@ +--- +id: discovery--old +title: GitHub Discovery +sidebar_label: Discovery +# prettier-ignore +description: Automatically discovering catalog entities from repositories in a GitHub organization +--- + +:::info +This documentation is written for the old backend which has been replaced by [the new backend system](../../backend-system/index.md), being the default since Backstage [version 1.24](../../releases/v1.24.0.md). If have migrated to the new backend system, you may want to read [its own article](./discovery.md) instead. Otherwise, [consider migrating](../../backend-system/building-backends/08-migrating.md)! +::: + +## GitHub Provider + +The GitHub integration has a discovery provider for discovering catalog +entities within a GitHub organization. The provider will crawl the GitHub +organization and register entities matching the configured path. This can be +useful as an alternative to static locations or manually adding things to the +catalog. This is the preferred method for ingesting entities into the catalog. + +## Installation without Events Support + +You will have to add the provider in the catalog initialization code of your +backend. They are not installed by default, therefore you have to add a +dependency on `@backstage/plugin-catalog-backend-module-github` to your backend +package. + +```bash +# From your Backstage root directory +yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-github +``` + +And then add the entity provider to your catalog builder: + +```ts title="packages/backend/src/plugins/catalog.ts" +/* highlight-add-next-line */ +import { GithubEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const builder = await CatalogBuilder.create(env); + /* highlight-add-start */ + builder.addEntityProvider( + GithubEntityProvider.fromConfig(env.config, { + logger: env.logger, + scheduler: env.scheduler, + }), + ); + /* highlight-add-end */ + + // .. +} +``` + +## Installation with Events Support + +_For the legacy backend system, please read the sub-section below._ + +The catalog module for GitHub comes with events support enabled. +This will make it subscribe to its relevant topics (`github.push`) +and expects these events to be published via the `EventsService`. + +Additionally, you should install the +[event router by `events-backend-module-github`](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-github/README.md) +which will route received events from the generic topic `github` to more specific ones +based on the event type (e.g., `github.push`). + +In order to receive Webhook events by GitHub, you have to decide how you want them +to be ingested into Backstage and published to its `EventsService`. +You can decide between the following options (extensible): + +- [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) +- [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) + +### Legacy Backend System + +Please follow the installation instructions at + +- +- + +Additionally, you need to decide how you want to receive events from external sources like + +- [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) +- [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) + +Set up your provider + +```ts title="packages/backend/src/plugins/catalog.ts" +import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; +/* highlight-add-next-line */ +import { GithubEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; +import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; +import { Router } from 'express'; +import { PluginEnvironment } from '../types'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const builder = await CatalogBuilder.create(env); + builder.addProcessor(new ScaffolderEntitiesProcessor()); + /* highlight-add-start */ + const githubProvider = GithubEntityProvider.fromConfig(env.config, { + events: env.events, + logger: env.logger, + scheduler: env.scheduler, + }); + builder.addEntityProvider(githubProvider); + /* highlight-add-end */ + const { processingEngine, router } = await builder.build(); + await processingEngine.start(); + return router; +} +``` + +You can check the official docs to [configure your webhook](https://docs.github.com/en/developers/webhooks-and-events/webhooks/creating-webhooks) and to [secure your request](https://docs.github.com/en/developers/webhooks-and-events/webhooks/securing-your-webhooks). The webhook will need to be configured to forward `push` events. + +## Configuration + +To use the discovery provider, you'll need a GitHub integration +[set up](locations.md) with either a [Personal Access Token](../../getting-started/config/authentication.md) or [GitHub Apps](./github-apps.md). For Personal Access Tokens you should pay attention to the [required scopes](https://backstage.io/docs/integrations/github/locations/#token-scopes), where you will need at least the `repo` scope for reading components. For GitHub Apps you will need to grant it the [required permissions](https://backstage.io/docs/integrations/github/github-apps#app-permissions) instead, where you will need at least the `Contents: Read-only` permissions for reading components. + +Then you can add a `github` config to the catalog providers configuration: + +```yaml +catalog: + providers: + github: + # the provider ID can be any camelCase string + providerId: + organization: 'backstage' # string + catalogPath: '/catalog-info.yaml' # string + filters: + branch: 'main' # string + repository: '.*' # Regex + schedule: # same options as in TaskScheduleDefinition + # supports cron, ISO duration, "human duration" as used in code + frequency: { minutes: 30 } + # supports ISO duration, "human duration" as used in code + timeout: { minutes: 3 } + customProviderId: + organization: 'new-org' # string + catalogPath: '/custom/path/catalog-info.yaml' # string + filters: # optional filters + branch: 'develop' # optional string + repository: '.*' # optional Regex + wildcardProviderId: + organization: 'new-org' # string + catalogPath: '/groups/**/*.yaml' # this will search all folders for files that end in .yaml + filters: # optional filters + branch: 'develop' # optional string + repository: '.*' # optional Regex + topicProviderId: + organization: 'backstage' # string + catalogPath: '/catalog-info.yaml' # string + filters: + branch: 'main' # string + repository: '.*' # Regex + topic: 'backstage-exclude' # optional string + topicFilterProviderId: + organization: 'backstage' # string + catalogPath: '/catalog-info.yaml' # string + filters: + branch: 'main' # string + repository: '.*' # Regex + topic: + include: ['backstage-include'] # optional array of strings + exclude: ['experiments'] # optional array of strings + validateLocationsExist: + organization: 'backstage' # string + catalogPath: '/catalog-info.yaml' # string + filters: + branch: 'main' # string + repository: '.*' # Regex + validateLocationsExist: true # optional boolean + visibilityProviderId: + organization: 'backstage' # string + catalogPath: '/catalog-info.yaml' # string + filters: + visibility: + - public + - internal + enterpriseProviderId: + host: ghe.example.net + organization: 'backstage' # string + catalogPath: '/catalog-info.yaml' # string +``` + +This provider supports multiple organizations via unique provider IDs. + +> **Note:** It is possible but certainly not recommended to skip the provider ID level. +> If you do so, `default` will be used as provider ID. + +- **`catalogPath`** _(optional)_: + Default: `/catalog-info.yaml`. + Path where to look for `catalog-info.yaml` files. + You can use wildcards - `*` or `**` - to search the path and/or the filename. + Wildcards cannot be used if the `validateLocationsExist` option is set to `true`. +- **`filters`** _(optional)_: + - **`branch`** _(optional)_: + String used to filter results based on the branch name. + - **`repository`** _(optional)_: + Regular expression used to filter results based on the repository name. + - **`topic`** _(optional)_: + Both of the filters below may be used at the same time but the exclusion filter has the highest priority. + In the example above, a repository with the `backstage-include` topic would still be excluded + if it were also carrying the `experiments` topic. + - **`include`** _(optional)_: + An array of strings used to filter in results based on their associated GitHub topics. + If configured, only repositories with one (or more) topic(s) present in the inclusion filter will be ingested + - **`exclude`** _(optional)_: + An array of strings used to filter out results based on their associated GitHub topics. + If configured, all repositories _except_ those with one (or more) topics(s) present in the exclusion filter will be ingested. + - **`visibility`** _(optional)_: + An array of strings used to filter results based on their visibility. Available options are `private`, `internal`, `public`. If configured (non empty), only repositories with visibility present in the filter will be ingested +- **`host`** _(optional)_: + The hostname of your GitHub Enterprise instance. It must match a host defined in [integrations.github](locations.md). +- **`organization`**: + Name of your organization account/workspace. + If you want to add multiple organizations, you need to add one provider config each. +- **`validateLocationsExist`** _(optional)_: + Whether to validate locations that exist before emitting them. + This option avoids generating locations for catalog info files that do not exist in the source repository. + Defaults to `false`. + Due to limitations in the GitHub API's ability to query for repository objects, this option cannot be used in + conjunction with wildcards in the `catalogPath`. +- **`schedule`**: + - **`frequency`**: + How often you want the task to run. The system does its best to avoid overlapping invocations. + - **`timeout`**: + The maximum amount of time that a single task invocation can take. + - **`initialDelay`** _(optional)_: + The amount of time that should pass before the first invocation happens. + - **`scope`** _(optional)_: + `'global'` or `'local'`. Sets the scope of concurrency control. + +## GitHub API Rate Limits + +GitHub [rate limits](https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting) API requests to 5,000 per hour (or more for Enterprise +accounts). The snippet below refreshes the Backstage catalog data every 35 minutes, which issues an API request for each discovered location. + +If your requests are too frequent then you may get throttled by +rate limiting. You can change the refresh frequency of the catalog in your `app-config.yaml` file by controlling the `schedule`. + +```yaml +schedule: + frequency: { minutes: 35 } + timeout: { minutes: 3 } +``` + +More information about scheduling can be found on the [TaskScheduleDefinition](https://backstage.io/docs/reference/backend-tasks.taskscheduledefinition) page. + +Alternatively, or additionally, you can configure [github-apps](github-apps.md) authentication +which carries a much higher rate limit at GitHub. + +This is true for any method of adding GitHub entities to the catalog, but +especially easy to hit with automatic discovery. + +## GitHub Processor (To Be Deprecated) + +The GitHub integration has a special discovery processor for discovering catalog +entities within a GitHub organization. The processor will crawl the GitHub +organization and register entities matching the configured path. This can be +useful as an alternative to static locations or manually adding things to the +catalog. + +## Installation + +You will have to add the processors in the catalog initialization code of your +backend. They are not installed by default, therefore you have to add a +dependency on `@backstage/plugin-catalog-backend-module-github` to your backend +package, plus `@backstage/integration` for the basic credentials management: + +```bash +# From your Backstage root directory +yarn --cwd packages/backend add @backstage/integration @backstage/plugin-catalog-backend-module-github +``` + +And then add the processors to your catalog builder: + +```ts title="packages/backend/src/plugins/catalog.ts" +/* highlight-add-start */ +import { + GithubDiscoveryProcessor, + GithubOrgReaderProcessor, +} from '@backstage/plugin-catalog-backend-module-github'; +import { + ScmIntegrations, + DefaultGithubCredentialsProvider, +} from '@backstage/integration'; +/* highlight-add-end */ + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const builder = await CatalogBuilder.create(env); + /* highlight-add-start */ + const integrations = ScmIntegrations.fromConfig(env.config); + const githubCredentialsProvider = + DefaultGithubCredentialsProvider.fromIntegrations(integrations); + builder.addProcessor( + GithubDiscoveryProcessor.fromConfig(env.config, { + logger: env.logger, + githubCredentialsProvider, + }), + GithubOrgReaderProcessor.fromConfig(env.config, { + logger: env.logger, + githubCredentialsProvider, + }), + ); + /* highlight-add-end */ + + // .. +} +``` + +## Configuration + +To use the discovery processor, you'll need a GitHub integration +[set up](locations.md) with either a [Personal Access Token](../../getting-started/config/authentication.md) or [GitHub Apps](./github-apps.md). + +Then you can add a location target to the catalog configuration: + +```yaml +catalog: + locations: + # (since 0.13.5) Scan all repositories for a catalog-info.yaml in the root of the default branch + - type: github-discovery + target: https://github.com/myorg + # Or use a custom pattern for a subset of all repositories with default repository + - type: github-discovery + target: https://github.com/myorg/service-*/blob/-/catalog-info.yaml + # Or use a custom file format and location + - type: github-discovery + target: https://github.com/*/blob/-/docs/your-own-format.yaml + # Or use a specific branch-name + - type: github-discovery + target: https://github.com/*/blob/backstage-docs/catalog-info.yaml +``` + +Note the `github-discovery` type, as this is not a regular `url` processor. + +When using a custom pattern, the target is composed of three parts: + +- The base organization URL, `https://github.com/myorg` in this case +- The repository blob to scan, which accepts \* wildcard tokens. This can simply + be `*` to scan all repositories in the organization. This example only looks + for repositories prefixed with `service-`. +- The path within each repository to find the catalog YAML file. This will + usually be `/blob/main/catalog-info.yaml`, `/blob/master/catalog-info.yaml` or + a similar variation for catalog files stored in the root directory of each + repository. You could also use a dash (`-`) for referring to the default + branch. + +## GitHub API Rate Limits + +GitHub [rate limits](https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting) API requests to 5,000 per hour (or more for Enterprise +accounts). The default Backstage catalog backend refreshes data every 100 +seconds, which issues an API request for each discovered location. + +This means if you have more than ~140 catalog entities, you may get throttled by +rate limiting. You can change the refresh rate of the catalog in your `packages/backend/src/plugins/catalog.ts` file: + +```typescript +const builder = await CatalogBuilder.create(env); + +// For example, to refresh every 5 minutes (300 seconds). +builder.setProcessingIntervalSeconds(300); +``` + +Alternatively, or additionally, you can configure [github-apps](github-apps.md) authentication +which carries a much higher rate limit at GitHub. + +This is true for any method of adding GitHub entities to the catalog, but +especially easy to hit with automatic discovery. diff --git a/docs/integrations/github/discovery.md b/docs/integrations/github/discovery.md index d0721e06f6..f16d1c17b2 100644 --- a/docs/integrations/github/discovery.md +++ b/docs/integrations/github/discovery.md @@ -6,6 +6,10 @@ sidebar_label: Discovery description: Automatically discovering catalog entities from repositories in a GitHub organization --- +:::info +This documentation is written for [the new backend system](../../backend-system/index.md) which is the default since Backstage [version 1.24](../../releases/v1.24.0.md). If you are still on the old backend system, you may want to read [its own article](./discovery--old.md) instead, and [consider migrating](../../backend-system/building-backends/08-migrating.md)! +::: + ## GitHub Provider The GitHub integration has a discovery provider for discovering catalog @@ -14,10 +18,9 @@ organization and register entities matching the configured path. This can be useful as an alternative to static locations or manually adding things to the catalog. This is the preferred method for ingesting entities into the catalog. -## Installation without Events Support +## Installation -You will have to add the provider in the catalog initialization code of your -backend. They are not installed by default, therefore you have to add a +You will have to add the GitHub Entity provider to your backend as it is not installed by default, therefore you have to add a dependency on `@backstage/plugin-catalog-backend-module-github` to your backend package. @@ -29,13 +32,12 @@ yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-github And then update your backend by adding the following line: ```ts title="packages/backend/src/index.ts" -// github discovery +backend.add(import('@backstage/plugin-catalog-backend/alpha')); +/* highlight-add-start */ backend.add(import('@backstage/plugin-catalog-backend-module-github/alpha')); ``` -## Installation with Events Support - -_For the legacy backend system, please read the sub-section below._ +## Events Support The catalog module for GitHub comes with events support enabled. This will make it subscribe to its relevant topics (`github.push`) @@ -53,47 +55,6 @@ You can decide between the following options (extensible): - [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) - [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) -### Legacy Backend System - -Please follow the installation instructions at - -- -- - -Additionally, you need to decide how you want to receive events from external sources like - -- [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) -- [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) - -Set up your provider - -```ts title="packages/backend/src/plugins/catalog.ts" -import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; -/* highlight-add-next-line */ -import { GithubEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; -import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; -import { Router } from 'express'; -import { PluginEnvironment } from '../types'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - const builder = await CatalogBuilder.create(env); - builder.addProcessor(new ScaffolderEntitiesProcessor()); - /* highlight-add-start */ - const githubProvider = GithubEntityProvider.fromConfig(env.config, { - events: env.events, - logger: env.logger, - scheduler: env.scheduler, - }); - builder.addEntityProvider(githubProvider); - /* highlight-add-end */ - const { processingEngine, router } = await builder.build(); - await processingEngine.start(); - return router; -} -``` - You can check the official docs to [configure your webhook](https://docs.github.com/en/developers/webhooks-and-events/webhooks/creating-webhooks) and to [secure your request](https://docs.github.com/en/developers/webhooks-and-events/webhooks/securing-your-webhooks). The webhook will need to be configured to forward `push` events. ## Configuration @@ -236,121 +197,3 @@ which carries a much higher rate limit at GitHub. This is true for any method of adding GitHub entities to the catalog, but especially easy to hit with automatic discovery. - -## GitHub Processor (To Be Deprecated) - -The GitHub integration has a special discovery processor for discovering catalog -entities within a GitHub organization. The processor will crawl the GitHub -organization and register entities matching the configured path. This can be -useful as an alternative to static locations or manually adding things to the -catalog. - -## Installation - -You will have to add the processors in the catalog initialization code of your -backend. They are not installed by default, therefore you have to add a -dependency on `@backstage/plugin-catalog-backend-module-github` to your backend -package, plus `@backstage/integration` for the basic credentials management: - -```bash -# From your Backstage root directory -yarn --cwd packages/backend add @backstage/integration @backstage/plugin-catalog-backend-module-github -``` - -And then add the processors to your catalog builder: - -```ts title="packages/backend/src/plugins/catalog.ts" -/* highlight-add-start */ -import { - GithubDiscoveryProcessor, - GithubOrgReaderProcessor, -} from '@backstage/plugin-catalog-backend-module-github'; -import { - ScmIntegrations, - DefaultGithubCredentialsProvider, -} from '@backstage/integration'; -/* highlight-add-end */ - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - const builder = await CatalogBuilder.create(env); - /* highlight-add-start */ - const integrations = ScmIntegrations.fromConfig(env.config); - const githubCredentialsProvider = - DefaultGithubCredentialsProvider.fromIntegrations(integrations); - builder.addProcessor( - GithubDiscoveryProcessor.fromConfig(env.config, { - logger: env.logger, - githubCredentialsProvider, - }), - GithubOrgReaderProcessor.fromConfig(env.config, { - logger: env.logger, - githubCredentialsProvider, - }), - ); - /* highlight-add-end */ - - // .. -} -``` - -## Configuration - -To use the discovery processor, you'll need a GitHub integration -[set up](locations.md) with either a [Personal Access Token](../../getting-started/config/authentication.md) or [GitHub Apps](./github-apps.md). - -Then you can add a location target to the catalog configuration: - -```yaml -catalog: - locations: - # (since 0.13.5) Scan all repositories for a catalog-info.yaml in the root of the default branch - - type: github-discovery - target: https://github.com/myorg - # Or use a custom pattern for a subset of all repositories with default repository - - type: github-discovery - target: https://github.com/myorg/service-*/blob/-/catalog-info.yaml - # Or use a custom file format and location - - type: github-discovery - target: https://github.com/*/blob/-/docs/your-own-format.yaml - # Or use a specific branch-name - - type: github-discovery - target: https://github.com/*/blob/backstage-docs/catalog-info.yaml -``` - -Note the `github-discovery` type, as this is not a regular `url` processor. - -When using a custom pattern, the target is composed of three parts: - -- The base organization URL, `https://github.com/myorg` in this case -- The repository blob to scan, which accepts \* wildcard tokens. This can simply - be `*` to scan all repositories in the organization. This example only looks - for repositories prefixed with `service-`. -- The path within each repository to find the catalog YAML file. This will - usually be `/blob/main/catalog-info.yaml`, `/blob/master/catalog-info.yaml` or - a similar variation for catalog files stored in the root directory of each - repository. You could also use a dash (`-`) for referring to the default - branch. - -## GitHub API Rate Limits - -GitHub [rate limits](https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting) API requests to 5,000 per hour (or more for Enterprise -accounts). The default Backstage catalog backend refreshes data every 100 -seconds, which issues an API request for each discovered location. - -This means if you have more than ~140 catalog entities, you may get throttled by -rate limiting. You can change the refresh rate of the catalog in your `packages/backend/src/plugins/catalog.ts` file: - -```typescript -const builder = await CatalogBuilder.create(env); - -// For example, to refresh every 5 minutes (300 seconds). -builder.setProcessingIntervalSeconds(300); -``` - -Alternatively, or additionally, you can configure [github-apps](github-apps.md) authentication -which carries a much higher rate limit at GitHub. - -This is true for any method of adding GitHub entities to the catalog, but -especially easy to hit with automatic discovery. diff --git a/docs/integrations/github/org--old.md b/docs/integrations/github/org--old.md new file mode 100644 index 0000000000..2f1b39a1f8 --- /dev/null +++ b/docs/integrations/github/org--old.md @@ -0,0 +1,368 @@ +--- +id: org--old +title: GitHub Organizational Data +sidebar_label: Org Data +# prettier-ignore +description: Importing users and groups from a GitHub organization into Backstage +--- + +:::info +This documentation is written for the old backend which has been replaced by [the new backend system](../../backend-system/index.md), being the default since Backstage [version 1.24](../../releases/v1.24.0.md). If have migrated to the new backend system, you may want to read [its own article](./org.md) instead.Otherwise, [consider migrating](../../backend-system/building-backends/08-migrating.md)! +::: + +The Backstage catalog can be set up to ingest organizational data - users and +teams - directly from an organization in GitHub or GitHub Enterprise. The result +is a hierarchy of +[`User`](../../features/software-catalog/descriptor-format.md#kind-user) and +[`Group`](../../features/software-catalog/descriptor-format.md#kind-group) kind +entities that mirror your org setup. + +> Note: This adds `User` and `Group` entities to the catalog, but does not +> provide authentication. See the +> [GitHub auth provider](../../auth/github/provider.md) for that. + +## Installation without Events Support + +This guide will use the Entity Provider method. If you for some reason prefer +the Processor method (not recommended), it is described separately below. + +The provider is not installed by default, therefore you have to add a dependency +to `@backstage/plugin-catalog-backend-module-github` to your backend package. + +```bash +# From your Backstage root directory +yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-github +``` + +> Note: When configuring to use a Provider instead of a Processor you do not +> need to add a _location_ pointing to your GitHub server/organization + +Update the catalog plugin initialization in your backend to add the provider and +schedule it: + +```ts title="packages/backend/src/plugins/catalog.ts" +/* highlight-add-next-line */ +import { GithubOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const builder = await CatalogBuilder.create(env); + + /* highlight-add-start */ + // The org URL below needs to match a configured integrations.github entry + // specified in your app-config. + builder.addEntityProvider( + GithubOrgEntityProvider.fromConfig(env.config, { + id: 'production', + orgUrl: 'https://github.com/backstage', + logger: env.logger, + schedule: env.scheduler.createScheduledTaskRunner({ + frequency: { minutes: 60 }, + timeout: { minutes: 15 }, + }), + }), + ); + /* highlight-add-end */ + + // .. +} +``` + +Alternatively, if you wish to ingest data from multiple GitHub organizations you can use +the `GithubMultiOrgEntityProvider` instead. Note that by default, this provider will namespace +groups according to the org they originate from to avoid potential name duplicates: + +```ts title="packages/backend/src/plugins/catalog.ts" +/* highlight-add-next-line */ +import { GithubMultiOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const builder = await CatalogBuilder.create(env); + + /* highlight-add-start */ + // The GitHub URL below needs to match a configured integrations.github entry + // specified in your app-config. + builder.addEntityProvider( + GithubMultiOrgEntityProvider.fromConfig(env.config, { + id: 'production', + githubUrl: 'https://github.com', + // Set the following to list the GitHub orgs you wish to ingest from. You can + // also omit this option to ingest all orgs accessible by your GitHub integration + orgs: ['org-a', 'org-b'], + logger: env.logger, + schedule: env.scheduler.createScheduledTaskRunner({ + frequency: { minutes: 60 }, + timeout: { minutes: 15 }, + }), + }), + ); + /* highlight-add-end */ + + // .. +} +``` + +## Installation with Events Support + +_For the legacy backend system, please read the subsection below._ + +The catalog module `github-org` comes with events support enabled for the `GithubMultiOrgEntityProvider`. +This will make it subscribe to its relevant topics and expects these events to be published via the `EventsService`. + +Topics: + +- `github.installation` +- `github.membership` +- `github.organization` +- `github.team` + +Additionally, you should install the +[event router by `events-backend-module-github`](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-github/README.md) +which will route received events from the generic topic `github` to more specific ones +based on the event type (e.g., `github.membership`). + +In order to receive Webhook events by GitHub, you have to decide how you want them +to be ingested into Backstage and published to its `EventsService`. +You can decide between the following options (extensible): + +- [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) +- [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) + +### Legacy Backend System + +Please follow the installation instructions at + +- +- + +Additionally, you need to decide how you want to receive events from external sources like + +- [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) +- [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) + +Set up your provider + +```ts title="packages/backend/src/plugins/catalog.ts" +import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; +/* highlight-add-next-line */ +import { GithubOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; +import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; +import { Router } from 'express'; +import { PluginEnvironment } from '../types'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const builder = await CatalogBuilder.create(env); + builder.addProcessor(new ScaffolderEntitiesProcessor()); + /* highlight-add-start */ + const githubOrgProvider = GithubOrgEntityProvider.fromConfig(env.config, { + id: 'production', + orgUrl: 'https://github.com/backstage', + logger: env.logger, + events: env.events, + schedule: env.scheduler.createScheduledTaskRunner({ + frequency: { minutes: 60 }, + timeout: { minutes: 15 }, + }), + }); + builder.addEntityProvider(githubOrgProvider); + /* highlight-add-end */ + const { processingEngine, router } = await builder.build(); + await processingEngine.start(); + return router; +} +``` + +Or, alternatively, if using the `GithubMultiOrgEntityProvider`: + +```ts title="packages/backend/src/plugins/catalog.ts" +/* highlight-add-next-line */ +import { GithubMultiOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const builder = await CatalogBuilder.create(env); + + /* highlight-add-start */ + // The GitHub URL below needs to match a configured integrations.github entry + // specified in your app-config. + builder.addEntityProvider( + GithubMultiOrgEntityProvider.fromConfig(env.config, { + id: 'production', + githubUrl: 'https://github.com', + // Set the following to list the GitHub orgs you wish to ingest from. You can + // also omit this option to ingest all orgs accessible by your GitHub integration + orgs: ['org-a', 'org-b'], + logger: env.logger, + events: env.events, + schedule: env.scheduler.createScheduledTaskRunner({ + frequency: { minutes: 60 }, + timeout: { minutes: 15 }, + }), + }), + ); + /* highlight-add-end */ + + // .. +} +``` + +You can check the official docs to [configure your webhook](https://docs.github.com/en/developers/webhooks-and-events/webhooks/creating-webhooks) and to [secure your request](https://docs.github.com/en/developers/webhooks-and-events/webhooks/securing-your-webhooks). +The webhook will need to be configured to forward `organization`,`team` and `membership` events. + +## Configuration + +As mentioned above, you also must have some configuration in your app-config +that describes the targets that you want to import. This lets the entity +provider know what authorization to use, and what the API endpoints are. You may +or may not have such an entry already added since before: + +```yaml +integrations: + github: + # example for public github + - host: github.com + token: ${GITHUB_TOKEN} + # example for a private GitHub Enterprise instance + - host: ghe.example.net + apiBaseUrl: https://ghe.example.net/api/v3 + token: ${GHE_TOKEN} +``` + +These examples use `${}` placeholders to reference environment variables. This +is often suitable for production setups, but also means that you will have to +supply those variables to the backend as it starts up. If you want, for local +development in particular, you can experiment first by putting the actual tokens +in a mirrored config directly in your `app-config.local.yaml` as well. + +If Backstage is configured to use GitHub Apps authentication you must grant +`Read-Only` access for `Members` under `Organization` in order to ingest users +correctly. You can modify the app's permissions under the organization settings, +`https://github.com/organizations/{ORG}/settings/apps/{APP_NAME}/permissions`. + +![permissions](../../assets/integrations/github/permissions.png) + +**Please note that when you change permissions, the app owner will get an email +that must be approved first before the changes are applied.** + +![email](../../assets/integrations/github/email.png) + +### Custom Transformers + +You can inject your own transformation logic to help map from GH API responses +into backstage entities. You can do this on the user and team requests to +enable you to do further processing or updates to the entities. + +To enable this you pass a function into the `GitHubOrgEntityProvider`. You can +pass a `UserTransformer`, `TeamTransformer` or both. The function is invoked +for each item (user or team) that is returned from the API. You can either +return an Entity (User or Group) or `undefined` if you do not want to import +that item. + +There is also a `defaultUserTransformer` and `defaultOrganizationTeamTransformer`. +You could use these and simply decorate the response from the default +transformation if you only need to change a few properties. + +### Resolving GitHub users via organization email + +When you authenticate users you should resolve them to an entity within the +catalog. Often the authentication you use could be a corporate SSO system that +provides you with email as a key. To enable you to find and resolve GitHub users +it's useful to also import the private domain verified emails into the User +entity in backstage. + +The integration attempts to return `organizationVerifiedDomainEmails` from the +GitHub API and makes this available as part of the object passed to +`UserTransformer`. The GitHub API will only return emails that use a domain +that's a verified domain for your GitHub Org. It also relies on the user having +configured such an email in their own account. The API will only return these +values when using GitHub App authentication and with the correct app permission +allowing access to emails. + +You can decorate the default `userTransformer` to replace the org email in the +returned identity. + +```ts title="packages/backend/src/plugins/catalog.ts" +const githubOrgProvider = GithubOrgEntityProvider.fromConfig(env.config, { + id: 'production', + orgUrl: 'https://github.com/backstage', + logger: env.logger, + schedule: env.scheduler.createScheduledTaskRunner({ + frequency: { minutes: 60 }, + timeout: { minutes: 15 }, + }), + /* highlight-add-start */ + userTransformer: async (user, ctx) => { + const entity = await defaultUserTransformer(user, ctx); + if (entity && user.organizationVerifiedDomainEmails?.length) { + entity.spec.profile!.email = user.organizationVerifiedDomainEmails[0]; + } + return entity; + }, + /* highlight-add-end */ +}); +``` + +Once you have imported the emails you can resolve users in your [sign-in +resolver](../../auth/github/provider.md) using the catalog entity search via email + +```typescript title="packages/backend/src/plugins/auth.ts" +ctx.signInWithCatalogUser({ + filter: { + kind: ['User'], + 'spec.profile.email': email as string, + }, +}); +``` + +## Using a Processor instead of a Provider + +An alternative to using the Provider for ingesting organizational entities is to +use a Processor. This is the old way that's based on registering locations with +the proper type and target, triggering the processor to run. + +The drawback of this method is that it will leave orphaned Group/User entities +whenever they are deleted on your GitHub server, and you cannot control the +frequency with which they are refreshed, separately from other processors. + +### Processor Installation + +The `GithubOrgReaderProcessor` is not registered by default, so you have to +install and register it in the catalog plugin: + +```bash +# From your Backstage root directory +yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-github +``` + +```typescript title="packages/backend/src/plugins/catalog.ts" +import { GithubOrgReaderProcessor } from '@backstage/plugin-catalog-backend-module-github'; + +builder.addProcessor( + GithubOrgReaderProcessor.fromConfig(env.config, { logger: env.logger }), +); +``` + +### Processor Configuration + +The integration section of your app-config needs to be set up in the same way as +for the Entity Provider - see above. + +In addition to that, you typically want to add a few static locations to your +app-config, which reference your organizations to import. The following +configuration enables an import of the teams and users under the org +`https://github.com/my-org-name` on public GitHub. + +```yaml +catalog: + locations: + - type: github-org + target: https://github.com/my-org-name + rules: + - allow: [User, Group] +``` diff --git a/docs/integrations/github/org.md b/docs/integrations/github/org.md index 974362c125..a9936ff558 100644 --- a/docs/integrations/github/org.md +++ b/docs/integrations/github/org.md @@ -6,6 +6,10 @@ sidebar_label: Org Data description: Importing users and groups from a GitHub organization into Backstage --- +:::info +This documentation is written for [the new backend system](../../backend-system/index.md) which is the default since Backstage [version 1.24](../../releases/v1.24.0.md). If you are still on the old backend system, you may want to read [its own article](./org--old.md) instead, and [consider migrating](../../backend-system/building-backends/08-migrating.md)! +::: + The Backstage catalog can be set up to ingest organizational data - users and teams - directly from an organization in GitHub or GitHub Enterprise. The result is a hierarchy of @@ -17,95 +21,28 @@ entities that mirror your org setup. > provide authentication. See the > [GitHub auth provider](../../auth/github/provider.md) for that. -## Installation without Events Support +## Installation -This guide will use the Entity Provider method. If you for some reason prefer -the Processor method (not recommended), it is described separately below. - -The provider is not installed by default, therefore you have to add a dependency -to `@backstage/plugin-catalog-backend-module-github` to your backend package. +You will have to add the GitHub Org provider to your backend as it is not installed by default, therefore you have to add a +dependency on `@backstage/plugin-catalog-backend-module-github-org` to your backend +package. ```bash # From your Backstage root directory -yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-github +yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-github-org ``` -> Note: When configuring to use a Provider instead of a Processor you do not -> need to add a _location_ pointing to your GitHub server/organization +And then update your backend by adding the following line: -Update the catalog plugin initialization in your backend to add the provider and -schedule it: - -```ts title="packages/backend/src/plugins/catalog.ts" -/* highlight-add-next-line */ -import { GithubOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - const builder = await CatalogBuilder.create(env); - - /* highlight-add-start */ - // The org URL below needs to match a configured integrations.github entry - // specified in your app-config. - builder.addEntityProvider( - GithubOrgEntityProvider.fromConfig(env.config, { - id: 'production', - orgUrl: 'https://github.com/backstage', - logger: env.logger, - schedule: env.scheduler.createScheduledTaskRunner({ - frequency: { minutes: 60 }, - timeout: { minutes: 15 }, - }), - }), - ); - /* highlight-add-end */ - - // .. -} +```ts title="packages/backend/src/index.ts" +backend.add(import('@backstage/plugin-catalog-backend/alpha')); +/* highlight-add-start */ +backend.add(import('@backstage/plugin-catalog-backend-module-github-org')); ``` -Alternatively, if you wish to ingest data from multiple GitHub organizations you can use -the `GithubMultiOrgEntityProvider` instead. Note that by default, this provider will namespace -groups according to the org they originate from to avoid potential name duplicates: +## Events Support -```ts title="packages/backend/src/plugins/catalog.ts" -/* highlight-add-next-line */ -import { GithubMultiOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - const builder = await CatalogBuilder.create(env); - - /* highlight-add-start */ - // The GitHub URL below needs to match a configured integrations.github entry - // specified in your app-config. - builder.addEntityProvider( - GithubMultiOrgEntityProvider.fromConfig(env.config, { - id: 'production', - githubUrl: 'https://github.com', - // Set the following to list the GitHub orgs you wish to ingest from. You can - // also omit this option to ingest all orgs accessible by your GitHub integration - orgs: ['org-a', 'org-b'], - logger: env.logger, - schedule: env.scheduler.createScheduledTaskRunner({ - frequency: { minutes: 60 }, - timeout: { minutes: 15 }, - }), - }), - ); - /* highlight-add-end */ - - // .. -} -``` - -## Installation with Events Support - -_For the legacy backend system, please read the subsection below._ - -The catalog module `github-org` comes with events support enabled for the `GithubMultiOrgEntityProvider`. +The catalog module for GitHub Org comes with events support enabled. This will make it subscribe to its relevant topics and expects these events to be published via the `EventsService`. Topics: @@ -127,87 +64,6 @@ You can decide between the following options (extensible): - [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) - [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) -### Legacy Backend System - -Please follow the installation instructions at - -- -- - -Additionally, you need to decide how you want to receive events from external sources like - -- [via HTTP endpoint](https://github.com/backstage/backstage/tree/master/plugins/events-backend/README.md) -- [via an AWS SQS queue](https://github.com/backstage/backstage/tree/master/plugins/events-backend-module-aws-sqs/README.md) - -Set up your provider - -```ts title="packages/backend/src/plugins/catalog.ts" -import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; -/* highlight-add-next-line */ -import { GithubOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; -import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; -import { Router } from 'express'; -import { PluginEnvironment } from '../types'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - const builder = await CatalogBuilder.create(env); - builder.addProcessor(new ScaffolderEntitiesProcessor()); - /* highlight-add-start */ - const githubOrgProvider = GithubOrgEntityProvider.fromConfig(env.config, { - id: 'production', - orgUrl: 'https://github.com/backstage', - logger: env.logger, - events: env.events, - schedule: env.scheduler.createScheduledTaskRunner({ - frequency: { minutes: 60 }, - timeout: { minutes: 15 }, - }), - }); - builder.addEntityProvider(githubOrgProvider); - /* highlight-add-end */ - const { processingEngine, router } = await builder.build(); - await processingEngine.start(); - return router; -} -``` - -Or, alternatively, if using the `GithubMultiOrgEntityProvider`: - -```ts title="packages/backend/src/plugins/catalog.ts" -/* highlight-add-next-line */ -import { GithubMultiOrgEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - const builder = await CatalogBuilder.create(env); - - /* highlight-add-start */ - // The GitHub URL below needs to match a configured integrations.github entry - // specified in your app-config. - builder.addEntityProvider( - GithubMultiOrgEntityProvider.fromConfig(env.config, { - id: 'production', - githubUrl: 'https://github.com', - // Set the following to list the GitHub orgs you wish to ingest from. You can - // also omit this option to ingest all orgs accessible by your GitHub integration - orgs: ['org-a', 'org-b'], - logger: env.logger, - events: env.events, - schedule: env.scheduler.createScheduledTaskRunner({ - frequency: { minutes: 60 }, - timeout: { minutes: 15 }, - }), - }), - ); - /* highlight-add-end */ - - // .. -} -``` - You can check the official docs to [configure your webhook](https://docs.github.com/en/developers/webhooks-and-events/webhooks/creating-webhooks) and to [secure your request](https://docs.github.com/en/developers/webhooks-and-events/webhooks/securing-your-webhooks). The webhook will need to be configured to forward `organization`,`team` and `membership` events. @@ -264,6 +120,81 @@ There is also a `defaultUserTransformer` and `defaultOrganizationTeamTransformer You could use these and simply decorate the response from the default transformation if you only need to change a few properties. +Here's an example of how to use the transformers: + +```ts title="packages/backend/src/index.ts" +import { createBackend } from '@backstage/backend-defaults'; +import { createBackendModule } from '@backstage/backend-plugin-api'; +import { githubOrgEntityProviderTransformsExtensionPoint } from '@backstage/plugin-catalog-backend-module-github-org'; +import { myTeamTransformer, myUserTransformer } from './transformers'; + +const githubOrgModule = createBackendModule({ + pluginId: 'catalog', + moduleId: 'github-org-extensions', + register(env) { + env.registerInit({ + deps: { + githubOrg: githubOrgEntityProviderTransformsExtensionPoint, + }, + async init({ githubOrg }) { + githubOrg.setTeamTransformer(myTeamTransformer); + githubOrg.setUserTransformer(myUserTransformer); + }, + }); + }, +}); + +const backend = createBackend(); + +// Other items + +backend.add(import('@backstage/plugin-catalog-backend/alpha')); + +backend.add(githubOrgModule()); + +backend.start(); +``` + +The `myTeamTransformer` and `myUserTransformer` transformer functions are from the examples in the section below. + +### Transformer Examples + +The following provides an example of each kind of transformer. We recommend creating a `transformers.ts` file in your `packages/backend/src` folder for these. + +```ts title="packages/backend/src/transformers.ts" +import { + TeamTransformer, + UserTransformer, + defaultUserTransformer, +} from '@backstage/plugin-catalog-backend-module-github'; + +// This team transformer completely replaces the built in logic with custom logic. +export const myTeamTransformer: TeamTransformer = async team => { + return { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Group', + metadata: { + name: team.slug, + annotations: {}, + }, + spec: { + type: 'GitHub Org Team', + profile: {}, + children: [], + }, + }; +}; + +// This user transformer makes use of the built in logic, but also sets the description field +export const myUserTransformer: UserTransformer = async (user, ctx) => { + const backstageUser = await defaultUserTransformer(user, ctx); + if (backstageUser) { + backstageUser.metadata.description = 'Loaded from GitHub Org Data'; + } + return backstageUser; +}; +``` + ### Resolving GitHub users via organization email When you authenticate users you should resolve them to an entity within the @@ -283,31 +214,25 @@ allowing access to emails. You can decorate the default `userTransformer` to replace the org email in the returned identity. -```ts title="packages/backend/src/plugins/catalog.ts" -const githubOrgProvider = GithubOrgEntityProvider.fromConfig(env.config, { - id: 'production', - orgUrl: 'https://github.com/backstage', - logger: env.logger, - schedule: env.scheduler.createScheduledTaskRunner({ - frequency: { minutes: 60 }, - timeout: { minutes: 15 }, - }), - /* highlight-add-start */ - userTransformer: async (user, ctx) => { - const entity = await defaultUserTransformer(user, ctx); - if (entity && user.organizationVerifiedDomainEmails?.length) { - entity.spec.profile!.email = user.organizationVerifiedDomainEmails[0]; - } - return entity; - }, - /* highlight-add-end */ -}); +```ts title="packages/backend/src/transformers.ts" +export const myVerifiedUserTransformer: UserTransformer = async (user, ctx) => { + const backstageUser = await defaultUserTransformer(user, ctx); + if (backstageUser && user.organizationVerifiedDomainEmails?.length) { + backstageUser.spec.profile!.email = + user.organizationVerifiedDomainEmails[0]; + } + return backstageUser; +}; ``` +This example assumes you have implemented the custom transformer following the [Custom Transformers](#custom-transformers) and [Transformer Examples](#transformer-examples) documentation in the sections above. + Once you have imported the emails you can resolve users in your [sign-in resolver](../../auth/github/provider.md) using the catalog entity search via email -```typescript title="packages/backend/src/plugins/auth.ts" +Once you have imported the emails you can resolve users by building a [Custom Resolver](../../auth/identity-resolver.md#building-custom-resolvers). In this custom resolver you can then use this example to properly match the user: + +```ts ctx.signInWithCatalogUser({ filter: { kind: ['User'], @@ -315,50 +240,3 @@ ctx.signInWithCatalogUser({ }, }); ``` - -## Using a Processor instead of a Provider - -An alternative to using the Provider for ingesting organizational entities is to -use a Processor. This is the old way that's based on registering locations with -the proper type and target, triggering the processor to run. - -The drawback of this method is that it will leave orphaned Group/User entities -whenever they are deleted on your GitHub server, and you cannot control the -frequency with which they are refreshed, separately from other processors. - -### Processor Installation - -The `GithubOrgReaderProcessor` is not registered by default, so you have to -install and register it in the catalog plugin: - -```bash -# From your Backstage root directory -yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-github -``` - -```typescript title="packages/backend/src/plugins/catalog.ts" -import { GithubOrgReaderProcessor } from '@backstage/plugin-catalog-backend-module-github'; - -builder.addProcessor( - GithubOrgReaderProcessor.fromConfig(env.config, { logger: env.logger }), -); -``` - -### Processor Configuration - -The integration section of your app-config needs to be set up in the same way as -for the Entity Provider - see above. - -In addition to that, you typically want to add a few static locations to your -app-config, which reference your organizations to import. The following -configuration enables an import of the teams and users under the org -`https://github.com/my-org-name` on public GitHub. - -```yaml -catalog: - locations: - - type: github-org - target: https://github.com/my-org-name - rules: - - allow: [User, Group] -``` From 2e14b0e9242ea5ae09594a686bdf40b844858c93 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Thu, 2 May 2024 08:46:27 -0500 Subject: [PATCH 056/136] Changes based on feedback Signed-off-by: Andre Wanlin --- docs/integrations/github/github-apps.md | 43 +++++++++-- docs/integrations/github/org.md | 99 ++++++++++++++----------- 2 files changed, 93 insertions(+), 49 deletions(-) diff --git a/docs/integrations/github/github-apps.md b/docs/integrations/github/github-apps.md index 604713a490..6e3d028e6d 100644 --- a/docs/integrations/github/github-apps.md +++ b/docs/integrations/github/github-apps.md @@ -31,7 +31,7 @@ A GitHub app created with the cli will have read access by default. You have to manually update the GitHub App settings in GitHub to grant the app more permissions if needed. -### Using the CLI (public GitHub only) +## Using the CLI (public GitHub only) You can use the `backstage-cli` to create a GitHub App using a manifest file that we provide. This gives us a way to automate some of the work required to @@ -53,7 +53,7 @@ Note that the created app will have a webhook that is disabled by default and points to `smee.io`, which is intended for local development. There's also currently no part of Backstage that makes use of the webhook. -### GitHub Enterprise +## GitHub Enterprise You have to create the GitHub Application manually using these [instructions](https://docs.github.com/en/free-pro-team@latest/developers/apps/creating-a-github-app) @@ -76,7 +76,7 @@ privateKey: | -----END RSA PRIVATE KEY----- ``` -### Including in Integrations Config +## Including in Integrations Config Once the credentials are stored in a YAML file generated by `create-github-app`, or manually by following the [GitHub Enterprise](#github-enterprise) @@ -95,7 +95,25 @@ integrations: - $include: example-backstage-app-credentials.yaml ``` -### Limiting the GitHub App installations +Alternatively you can use environment variables as well: + +```yaml +integrations: + github: + - host: github.com + apps: + - appId: ${AUTH_ORG_APP_ID} + clientId: ${AUTH_ORG_CLIENT_ID} + clientSecret: ${AUTH_ORG_CLIENT_SECRET} + privateKey: ${AUTH_ORG1_PRIVATE_KEY} + webhookSecret: ${AUTH_ORG_WEBHOOK_SECRET} +``` + +:::Note +Note that in both examples above `apps` is an array which means you can add multiple GitHub Apps using `$include` or environment variables as long as they are each for a different GitHub Org as mentioned under the [Caveats](#caveats) section +::: + +## Limiting the GitHub App installations If you want to limit the GitHub app installations visible to backstage you may optionally include the `allowedInstallationOwners` option. If you configure @@ -117,7 +135,7 @@ privateKey: | This will result in backstage preventing the use of any installation that is not within the allow list. -### App permissions +## App permissions When creating a GitHub App, you must select permissions to define the level of access for the app. The permissions required vary depending on your use of the @@ -140,7 +158,20 @@ integration: - `Secrets`: `Read & write` (if templates include GitHub Action Repository Secrets) - `Environments`: `Read & write` (if templates include GitHub Environments) -### Troubleshooting +## Updating Permissions + +There may be times where you need to update the permissions for your GitHub App, to easily get at the GitHub App you can find it at this URL: + +```sh +https://github.com/organizations/{ORG}/settings/apps/{APP_NAME}/permissions +``` + +**Please note that when you change permissions, the app owner will get an email +that must be approved first before the changes are applied.** + +![email](../../assets/integrations/github/email.png) + +## Troubleshooting `HttpError: This endpoint requires you to be authenticated.` diff --git a/docs/integrations/github/org.md b/docs/integrations/github/org.md index a9936ff558..0b33cfa184 100644 --- a/docs/integrations/github/org.md +++ b/docs/integrations/github/org.md @@ -21,6 +21,13 @@ entities that mirror your org setup. > provide authentication. See the > [GitHub auth provider](../../auth/github/provider.md) for that. +## Permissions + +Prior to installing the GitHub Org provider you should confirm you have the right permissions: + +- Personal Access Token permissions are listed in the [GitHub Locations](./locations.md#token-scopes) documentation +- GitHub App(s) permissions are listed in the [GitHub Apps](./github-apps.md#app-permissions) documentation + ## Installation You will have to add the GitHub Org provider to your backend as it is not installed by default, therefore you have to add a @@ -32,7 +39,22 @@ package. yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-github-org ``` -And then update your backend by adding the following line: +Next add the basic configuration to `app-config.yaml` + +```yaml title="app-config.yaml" +catalog: + providers: + githubOrg: + id: github + githubUrl: https://github.com + orgs: ['organization-1', 'organization-2', 'organization-3'] + schedule: + initialDelay: { seconds: 30 } + frequency: { hours: 1 } + timeout: { minutes: 50 } +``` + +Finally, update your backend by adding the following line: ```ts title="packages/backend/src/index.ts" backend.add(import('@backstage/plugin-catalog-backend/alpha')); @@ -40,7 +62,38 @@ backend.add(import('@backstage/plugin-catalog-backend/alpha')); backend.add(import('@backstage/plugin-catalog-backend-module-github-org')); ``` -## Events Support +### Configuration Details + +In the installation steps above we included an simple example of the needed configuration. The section goes into more details about the various configuration options. + +```yaml title="app-config.yaml" +catalog: + providers: + githubOrg: + - id: github + githubUrl: https://github.com + orgs: ['organization-1', 'organization-2', 'organization-3'] + schedule: + initialDelay: { seconds: 30 } + frequency: { hours: 1 } + timeout: { minutes: 50 } + - id: ghe + githubUrl: https://ghe.mycompany.com + orgs: ['internal-1', 'internal-2', 'internal-3'] + schedule: + initialDelay: { seconds: 30 } + frequency: { hours: 1 } + timeout: { minutes: 50 } +``` + +Directly under the `githubOrg` is a list of configurations, each entry is a structure with the following elements: + +- `id`: A stable id for this provider. Entities from this provider will be associated with this ID, so you should take care not to change it over time since that may lead to orphaned entities and/or conflicts. +- `githubUrl`: The target that this provider should consume +- `orgs` (optional): The list of the GitHub orgs to consume. By default wil consume all accessible orgs on the given GitHub instance (support for GitHub App integration only). +- `schedule`: The refresh schedule to use, matches the structure of [`TaskScheduleDefinitionConfig`](https://backstage.io/docs/reference/backend-tasks.taskscheduledefinitionconfig/) + +### Events Support The catalog module for GitHub Org comes with events support enabled. This will make it subscribe to its relevant topics and expects these events to be published via the `EventsService`. @@ -67,44 +120,7 @@ You can decide between the following options (extensible): You can check the official docs to [configure your webhook](https://docs.github.com/en/developers/webhooks-and-events/webhooks/creating-webhooks) and to [secure your request](https://docs.github.com/en/developers/webhooks-and-events/webhooks/securing-your-webhooks). The webhook will need to be configured to forward `organization`,`team` and `membership` events. -## Configuration - -As mentioned above, you also must have some configuration in your app-config -that describes the targets that you want to import. This lets the entity -provider know what authorization to use, and what the API endpoints are. You may -or may not have such an entry already added since before: - -```yaml -integrations: - github: - # example for public github - - host: github.com - token: ${GITHUB_TOKEN} - # example for a private GitHub Enterprise instance - - host: ghe.example.net - apiBaseUrl: https://ghe.example.net/api/v3 - token: ${GHE_TOKEN} -``` - -These examples use `${}` placeholders to reference environment variables. This -is often suitable for production setups, but also means that you will have to -supply those variables to the backend as it starts up. If you want, for local -development in particular, you can experiment first by putting the actual tokens -in a mirrored config directly in your `app-config.local.yaml` as well. - -If Backstage is configured to use GitHub Apps authentication you must grant -`Read-Only` access for `Members` under `Organization` in order to ingest users -correctly. You can modify the app's permissions under the organization settings, -`https://github.com/organizations/{ORG}/settings/apps/{APP_NAME}/permissions`. - -![permissions](../../assets/integrations/github/permissions.png) - -**Please note that when you change permissions, the app owner will get an email -that must be approved first before the changes are applied.** - -![email](../../assets/integrations/github/email.png) - -### Custom Transformers +## Custom Transformers You can inject your own transformation logic to help map from GH API responses into backstage entities. You can do this on the user and team requests to @@ -227,9 +243,6 @@ export const myVerifiedUserTransformer: UserTransformer = async (user, ctx) => { This example assumes you have implemented the custom transformer following the [Custom Transformers](#custom-transformers) and [Transformer Examples](#transformer-examples) documentation in the sections above. -Once you have imported the emails you can resolve users in your [sign-in -resolver](../../auth/github/provider.md) using the catalog entity search via email - Once you have imported the emails you can resolve users by building a [Custom Resolver](../../auth/identity-resolver.md#building-custom-resolvers). In this custom resolver you can then use this example to properly match the user: ```ts From 8834dafd474812f920c33462222430991e628c05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 2 May 2024 15:59:06 +0200 Subject: [PATCH 057/136] Added for easier consumption MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/proud-comics-love.md | 6 ++ plugins/catalog-react/api-report.md | 1 + .../EntityPresentationApi.ts | 4 + .../useEntityPresentation.ts | 3 +- .../EntityDisplayName.test.tsx | 4 + .../DefaultEntityPresentationApi.test.ts | 72 +++++++++------ .../DefaultEntityPresentationApi.ts | 91 ++++++++++++------- 7 files changed, 117 insertions(+), 64 deletions(-) create mode 100644 .changeset/proud-comics-love.md diff --git a/.changeset/proud-comics-love.md b/.changeset/proud-comics-love.md new file mode 100644 index 0000000000..6891bf937b --- /dev/null +++ b/.changeset/proud-comics-love.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-react': minor +'@backstage/plugin-catalog': minor +--- + +Updated the presentation API to return a promise, in addition to the snapshot and observable that were there before. This makes it much easier to consume the API in a non-React context. diff --git a/plugins/catalog-react/api-report.md b/plugins/catalog-react/api-report.md index 55064ff91f..79aad53c33 100644 --- a/plugins/catalog-react/api-report.md +++ b/plugins/catalog-react/api-report.md @@ -460,6 +460,7 @@ export type EntityRefLinksProps< // @public export interface EntityRefPresentation { + promise: Promise; snapshot: EntityRefPresentationSnapshot; update$?: Observable; } diff --git a/plugins/catalog-react/src/apis/EntityPresentationApi/EntityPresentationApi.ts b/plugins/catalog-react/src/apis/EntityPresentationApi/EntityPresentationApi.ts index 945bce1d27..642dd6dbac 100644 --- a/plugins/catalog-react/src/apis/EntityPresentationApi/EntityPresentationApi.ts +++ b/plugins/catalog-react/src/apis/EntityPresentationApi/EntityPresentationApi.ts @@ -109,6 +109,10 @@ export interface EntityRefPresentation { * elsewhere. */ update$?: Observable; + /** + * A promise that resolves to a usable entity presentation. + */ + promise: Promise; } /** diff --git a/plugins/catalog-react/src/apis/EntityPresentationApi/useEntityPresentation.ts b/plugins/catalog-react/src/apis/EntityPresentationApi/useEntityPresentation.ts index bae3936cc8..e397558ed0 100644 --- a/plugins/catalog-react/src/apis/EntityPresentationApi/useEntityPresentation.ts +++ b/plugins/catalog-react/src/apis/EntityPresentationApi/useEntityPresentation.ts @@ -61,7 +61,8 @@ export function useEntityPresentation( const presentation = useMemo( () => { if (!entityPresentationApi) { - return { snapshot: defaultEntityPresentation(entityOrRef, context) }; + const fallback = defaultEntityPresentation(entityOrRef, context); + return { snapshot: fallback, promise: Promise.resolve(fallback) }; } return entityPresentationApi.forEntity( diff --git a/plugins/catalog-react/src/components/EntityDisplayName/EntityDisplayName.test.tsx b/plugins/catalog-react/src/components/EntityDisplayName/EntityDisplayName.test.tsx index 573cfa9011..3a3816e1e3 100644 --- a/plugins/catalog-react/src/components/EntityDisplayName/EntityDisplayName.test.tsx +++ b/plugins/catalog-react/src/components/EntityDisplayName/EntityDisplayName.test.tsx @@ -73,6 +73,10 @@ describe('', () => { update$: new ObservableImpl(subscriber => { promise.then(value => subscriber.next(value)); }), + promise: Promise.resolve({ + entityRef: 'component:default/foo', + primaryTitle: 'foo', + }), } as EntityRefPresentation); await renderInTestApp( diff --git a/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.test.ts b/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.test.ts index 42ff777cbd..4cc4d79f52 100644 --- a/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.test.ts +++ b/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.test.ts @@ -23,10 +23,11 @@ import { import { DefaultEntityPresentationApi } from './DefaultEntityPresentationApi'; describe('DefaultEntityPresentationApi', () => { - it('works in local mode', () => { + it('works in local mode', async () => { const api = DefaultEntityPresentationApi.createLocal(); - expect(api.forEntity('component:default/test')).toEqual({ + let presentation = api.forEntity('component:default/test'); + expect(presentation).toEqual({ snapshot: { entityRef: 'component:default/test', entity: undefined, @@ -35,11 +36,14 @@ describe('DefaultEntityPresentationApi', () => { Icon: expect.anything(), }, update$: undefined, + promise: expect.any(Promise), }); + await expect(presentation.promise).resolves.toEqual(presentation.snapshot); - expect( - api.forEntity('component:default/test', { defaultKind: 'Other' }), - ).toEqual({ + presentation = api.forEntity('component:default/test', { + defaultKind: 'Other', + }); + expect(presentation).toEqual({ snapshot: { entityRef: 'component:default/test', entity: undefined, @@ -48,13 +52,14 @@ describe('DefaultEntityPresentationApi', () => { Icon: expect.anything(), }, update$: undefined, + promise: expect.any(Promise), }); + await expect(presentation.promise).resolves.toEqual(presentation.snapshot); - expect( - api.forEntity('component:default/test', { - defaultNamespace: 'other', - }), - ).toEqual({ + presentation = api.forEntity('component:default/test', { + defaultNamespace: 'other', + }); + expect(presentation).toEqual({ snapshot: { entityRef: 'component:default/test', entity: undefined, @@ -63,7 +68,9 @@ describe('DefaultEntityPresentationApi', () => { Icon: expect.anything(), }, update$: undefined, + promise: expect.any(Promise), }); + await expect(presentation.promise).resolves.toEqual(presentation.snapshot); const entity: Entity = { apiVersion: 'backstage.io/v1alpha1', @@ -77,7 +84,8 @@ describe('DefaultEntityPresentationApi', () => { }, }; - expect(api.forEntity(entity)).toEqual({ + presentation = api.forEntity(entity); + expect(presentation).toEqual({ snapshot: { entityRef: 'component:default/test', primaryTitle: 'test', @@ -85,7 +93,9 @@ describe('DefaultEntityPresentationApi', () => { Icon: expect.anything(), }, update$: undefined, + promise: expect.any(Promise), }); + await expect(presentation.promise).resolves.toEqual(presentation.snapshot); }); it('works in catalog mode', async () => { @@ -114,34 +124,38 @@ describe('DefaultEntityPresentationApi', () => { }); // return simple presentation, call catalog, return full presentation - await expect( - consumePresentation(api.forEntity('component:default/test')), - ).resolves.toEqual([ + let presentation = api.forEntity('component:default/test'); + let expected: EntityRefPresentationSnapshot = { + entityRef: 'component:default/test', + primaryTitle: 'test', + secondaryTitle: 'component:default/test | service', + Icon: expect.anything(), + }; + await expect(consumePresentation(presentation)).resolves.toEqual([ + // first the dummy snapshot { entityRef: 'component:default/test', primaryTitle: 'test', secondaryTitle: 'component:default/test', Icon: expect.anything(), }, - { - entityRef: 'component:default/test', - primaryTitle: 'test', - secondaryTitle: 'component:default/test | service', - Icon: expect.anything(), - }, + expected, ]); + await expect(presentation.promise).resolves.toEqual(expected); // use cached entity, immediately return full presentation - await expect( - consumePresentation(api.forEntity('component:default/test')), - ).resolves.toEqual([ - { - entityRef: 'component:default/test', - primaryTitle: 'test', - secondaryTitle: 'component:default/test | service', - Icon: expect.anything(), - }, + presentation = api.forEntity('component:default/test'); + expected = { + entityRef: 'component:default/test', + primaryTitle: 'test', + secondaryTitle: 'component:default/test | service', + Icon: expect.anything(), + }; + expect(presentation.snapshot).toEqual(expected); + await expect(consumePresentation(presentation)).resolves.toEqual([ + expected, ]); + await expect(presentation.promise).resolves.toEqual(presentation.snapshot); expect(catalogApi.getEntitiesByRefs).toHaveBeenCalledTimes(1); expect(catalogApi.getEntitiesByRefs).toHaveBeenCalledWith( diff --git a/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.ts b/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.ts index 82862be435..9630c6c216 100644 --- a/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.ts +++ b/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.ts @@ -260,47 +260,70 @@ export class DefaultEntityPresentationApi implements EntityPresentationApi { }; } + if (!needsLoad) { + return { + snapshot: initialSnapshot, + promise: Promise.resolve(initialSnapshot), + }; + } + + const loadingPromise = Promise.resolve().then(() => + this.#loader?.load(entityRef), + ); + // And then the following snapshot - const observable = !needsLoad - ? undefined - : new ObservableImpl(subscriber => { - let aborted = false; + const observable = new ObservableImpl( + subscriber => { + let aborted = false; - Promise.resolve() - .then(() => this.#loader?.load(entityRef)) - .then(newEntity => { - if ( - !aborted && - newEntity && - newEntity.metadata.etag !== entity?.metadata.etag - ) { - const updatedSnapshot = render({ - loading: false, - entity: newEntity, - }); - subscriber.next(updatedSnapshot); - } - }) - .catch(() => { - // Intentionally ignored - we do not propagate errors to the - // observable here. The presentation API should be error free and - // always return SOMETHING that makes sense to render, and we have - // already ensured above that the initial snapshot was that. - }) - .finally(() => { - if (!aborted) { - subscriber.complete(); - } - }); + loadingPromise + .then(newEntity => { + if ( + !aborted && + newEntity && + newEntity.metadata.etag !== entity?.metadata.etag + ) { + const updatedSnapshot = render({ + loading: false, + entity: newEntity, + }); + subscriber.next(updatedSnapshot); + } + }) + .catch(() => { + // Intentionally ignored - we do not propagate errors to the + // observable here. The presentation API should be error free and + // always return SOMETHING that makes sense to render, and we have + // already ensured above that the initial snapshot was that. + }) + .finally(() => { + if (!aborted) { + subscriber.complete(); + } + }); - return () => { - aborted = true; - }; - }); + return () => { + aborted = true; + }; + }, + ); + + const promise = loadingPromise + .then(newEntity => { + if (newEntity && newEntity.metadata.etag !== entity?.metadata.etag) { + return render({ + loading: false, + entity: newEntity, + }); + } + return initialSnapshot; + }) + .catch(() => initialSnapshot); return { snapshot: initialSnapshot, update$: observable, + promise: promise, }; } From e028d2793863e7a3a800bb12642e256d7f7dfac0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 15:13:19 +0000 Subject: [PATCH 058/136] chore(deps): pin actions/setup-python action to 82c7e63 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/verify_microsite.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index 68378aa086..7108d176c2 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -34,7 +34,7 @@ jobs: uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: node-version: 18.x - - uses: actions/setup-python@v5 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: python-version: '3.9' From d675d6464174981488d145922acb9d4265b5936d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 15:13:59 +0000 Subject: [PATCH 059/136] chore(deps): update github artifact actions to v4 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/api-breaking-changes.yml | 4 ++-- .github/workflows/pr-review-comment-trigger.yaml | 2 +- .github/workflows/scorecard.yml | 2 +- .github/workflows/uffizzi-build.yml | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/api-breaking-changes.yml b/.github/workflows/api-breaking-changes.yml index 07206718bb..7834fd195f 100644 --- a/.github/workflows/api-breaking-changes.yml +++ b/.github/workflows/api-breaking-changes.yml @@ -42,14 +42,14 @@ jobs: yarn backstage-repo-tools repo schema openapi check --since origin/${{ github.base_ref }} > comment.md - name: Upload Rendered Comment as Artifact - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4 with: name: preview-spec path: comment.md retention-days: 2 - name: Upload PR Event as Artifact - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: preview-spec path: ${{ github.event_path }} diff --git a/.github/workflows/pr-review-comment-trigger.yaml b/.github/workflows/pr-review-comment-trigger.yaml index 46f7dad8a3..4d7d511cc8 100644 --- a/.github/workflows/pr-review-comment-trigger.yaml +++ b/.github/workflows/pr-review-comment-trigger.yaml @@ -30,7 +30,7 @@ jobs: run: | mkdir -p ./pr echo $PR_NUMBER > ./pr/pr_number - - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: pr_number-${{ github.event.pull_request.number }} path: pr/ diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 91f1b02fee..355ecf6727 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -58,7 +58,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: 'Upload artifact' - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: SARIF file path: results.sarif diff --git a/.github/workflows/uffizzi-build.yml b/.github/workflows/uffizzi-build.yml index 4a52af21bc..7ccf39489e 100644 --- a/.github/workflows/uffizzi-build.yml +++ b/.github/workflows/uffizzi-build.yml @@ -98,13 +98,13 @@ jobs: kustomize build . > manifests.rendered.yml cat manifests.rendered.yml - name: Upload Rendered Manifests File as Artifact - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4 with: name: preview-spec path: ./.github/uffizzi/k8s/manifests/manifests.rendered.yml retention-days: 2 - name: Upload PR Event as Artifact - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: preview-spec path: ${{ github.event_path }} @@ -122,7 +122,7 @@ jobs: # If this PR is closing, we will not render a compose file nor pass it to the next workflow. - name: Upload PR Event as Artifact - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: preview-spec path: ${{ github.event_path }} From f2a2a83b8df7378752c0ae09bc4c23d5f4578075 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 2 May 2024 17:55:54 +0200 Subject: [PATCH 060/136] catalog-node: update catalogAnalysisExtensionPoint Signed-off-by: Patrik Oldsberg --- .changeset/brave-carrots-glow.md | 5 +++ .changeset/early-starfishes-hammer.md | 5 +++ .changeset/happy-radios-kiss.md | 5 +++ .changeset/rich-adults-float.md | 5 +++ .changeset/tough-eggs-wink.md | 5 +++ .../src/module/githubCatalogModule.test.ts | 5 ++- .../src/module/githubCatalogModule.ts | 2 +- plugins/catalog-backend/api-report.md | 11 ++--- plugins/catalog-backend/src/deprecated.ts | 6 +++ plugins/catalog-backend/src/index.ts | 1 - .../src/ingestion/LocationAnalyzer.ts | 6 ++- .../catalog-backend/src/ingestion/index.ts | 17 -------- .../catalog-backend/src/ingestion/types.ts | 33 --------------- .../src/service/CatalogBuilder.ts | 2 +- .../src/service/CatalogPlugin.ts | 40 +++++++++---------- .../src/service/createRouter.test.ts | 2 +- .../src/service/createRouter.ts | 2 +- plugins/catalog-node/api-report-alpha.md | 5 ++- plugins/catalog-node/api-report.md | 9 +++++ plugins/catalog-node/src/extensions.ts | 12 +++++- plugins/catalog-node/src/processing/index.ts | 1 + plugins/catalog-node/src/processing/types.ts | 19 ++++++++- 22 files changed, 107 insertions(+), 91 deletions(-) create mode 100644 .changeset/brave-carrots-glow.md create mode 100644 .changeset/early-starfishes-hammer.md create mode 100644 .changeset/happy-radios-kiss.md create mode 100644 .changeset/rich-adults-float.md create mode 100644 .changeset/tough-eggs-wink.md delete mode 100644 plugins/catalog-backend/src/ingestion/index.ts delete mode 100644 plugins/catalog-backend/src/ingestion/types.ts diff --git a/.changeset/brave-carrots-glow.md b/.changeset/brave-carrots-glow.md new file mode 100644 index 0000000000..b4493bf4f6 --- /dev/null +++ b/.changeset/brave-carrots-glow.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-node': minor +--- + +Added `LocationAnalyzer` type, moved from `@backstage/plugin-catalog-backend`. diff --git a/.changeset/early-starfishes-hammer.md b/.changeset/early-starfishes-hammer.md new file mode 100644 index 0000000000..abe17e85a2 --- /dev/null +++ b/.changeset/early-starfishes-hammer.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +Deprecated the `LocationAnalyzer` type, which has been moved to `@backstage/plugin-catalog-node`. diff --git a/.changeset/happy-radios-kiss.md b/.changeset/happy-radios-kiss.md new file mode 100644 index 0000000000..1097c832d8 --- /dev/null +++ b/.changeset/happy-radios-kiss.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +The `/alpha` plugin export has had its implementation of the `catalogAnalysisExtensionPoint` updated to reflect the new API. diff --git a/.changeset/rich-adults-float.md b/.changeset/rich-adults-float.md new file mode 100644 index 0000000000..5a9746b8f5 --- /dev/null +++ b/.changeset/rich-adults-float.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-github': patch +--- + +Updated to use the new `catalogAnalysisExtensionPoint` API. diff --git a/.changeset/tough-eggs-wink.md b/.changeset/tough-eggs-wink.md new file mode 100644 index 0000000000..52644e3620 --- /dev/null +++ b/.changeset/tough-eggs-wink.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-node': minor +--- + +Breaking change to `/alpha` API where the `catalogAnalysisExtensionPoint` has been reworked. The `addLocationAnalyzer` method has been renamed to `addScmLocationAnalyzer`, and a new `setLocationAnalyzer` method has been added which allows the full `LocationAnalyzer` implementation to be overridden. diff --git a/plugins/catalog-backend-module-github/src/module/githubCatalogModule.test.ts b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.test.ts index 0f466fefb7..24ee7f7108 100644 --- a/plugins/catalog-backend-module-github/src/module/githubCatalogModule.test.ts +++ b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.test.ts @@ -37,7 +37,8 @@ describe('githubCatalogModule', () => { }; const analysisExtensionPoint = { - addLocationAnalyzer: jest.fn(), + setLocationAnalyzer: jest.fn(), + addScmLocationAnalyzer: jest.fn(), }; const runner = jest.fn(); @@ -81,7 +82,7 @@ describe('githubCatalogModule', () => { 'github-provider:default', ); expect(runner).not.toHaveBeenCalled(); - expect(analysisExtensionPoint.addLocationAnalyzer).toHaveBeenCalledWith( + expect(analysisExtensionPoint.addScmLocationAnalyzer).toHaveBeenCalledWith( expect.any(GithubLocationAnalyzer), ); }); diff --git a/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts index 0b46e1a023..809a1a5094 100644 --- a/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts +++ b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts @@ -56,7 +56,7 @@ export const githubCatalogModule = createBackendModule({ discovery, auth, }) { - analyzers.addLocationAnalyzer( + analyzers.addScmLocationAnalyzer( new GithubLocationAnalyzer({ discovery, config, diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index 27c00257a5..1c65abf83e 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -41,6 +41,7 @@ import { EntityRelationSpec as EntityRelationSpec_2 } from '@backstage/plugin-ca import { EventBroker } from '@backstage/plugin-events-node'; import { GetEntitiesRequest } from '@backstage/catalog-client'; import { HttpAuthService } from '@backstage/backend-plugin-api'; +import { LocationAnalyzer as LocationAnalyzer_2 } from '@backstage/plugin-catalog-node'; import { LocationSpec as LocationSpec_2 } from '@backstage/plugin-catalog-common'; import { locationSpecToLocationEntity as locationSpecToLocationEntity_2 } from '@backstage/plugin-catalog-node'; import { locationSpecToMetadataName as locationSpecToMetadataName_2 } from '@backstage/plugin-catalog-node'; @@ -167,7 +168,7 @@ export class CatalogBuilder { setEntityDataParser(parser: CatalogProcessorParser_2): CatalogBuilder; setEventBroker(broker: EventBroker): CatalogBuilder; setFieldFormatValidators(validators: Partial): CatalogBuilder; - setLocationAnalyzer(locationAnalyzer: LocationAnalyzer): CatalogBuilder; + setLocationAnalyzer(locationAnalyzer: LocationAnalyzer_2): CatalogBuilder; setPlaceholderResolver( key: string, resolver: PlaceholderResolver_2, @@ -359,12 +360,8 @@ export class FileReaderProcessor implements CatalogProcessor_2 { ): Promise; } -// @public (undocumented) -export type LocationAnalyzer = { - analyzeLocation( - location: AnalyzeLocationRequest_2, - ): Promise; -}; +// @public @deprecated (undocumented) +export type LocationAnalyzer = LocationAnalyzer_2; // @public @deprecated export class LocationEntityProcessor implements CatalogProcessor_2 { diff --git a/plugins/catalog-backend/src/deprecated.ts b/plugins/catalog-backend/src/deprecated.ts index 72c3cad225..2d08d2ce0c 100644 --- a/plugins/catalog-backend/src/deprecated.ts +++ b/plugins/catalog-backend/src/deprecated.ts @@ -48,6 +48,7 @@ import { type PlaceholderResolverParams as _PlaceholderResolverParams, type PlaceholderResolverRead as _PlaceholderResolverRead, type PlaceholderResolverResolveUrl as _PlaceholderResolverResolveUrl, + type LocationAnalyzer as _LocationAnalyzer, type ScmLocationAnalyzer as _ScmLocationAnalyzer, } from '@backstage/plugin-catalog-node'; import { @@ -177,6 +178,11 @@ export type LocationSpec = _LocationSpec; * @deprecated import from `@backstage/plugin-catalog-node` instead */ export type AnalyzeOptions = _AnalyzeOptions; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type LocationAnalyzer = _LocationAnalyzer; /** * @public * @deprecated import from `@backstage/plugin-catalog-node` instead diff --git a/plugins/catalog-backend/src/index.ts b/plugins/catalog-backend/src/index.ts index 6a479babdc..d3ffa9a974 100644 --- a/plugins/catalog-backend/src/index.ts +++ b/plugins/catalog-backend/src/index.ts @@ -20,7 +20,6 @@ * @packageDocumentation */ -export * from './ingestion'; export * from './modules'; export * from './processing'; export * from './search'; diff --git a/plugins/catalog-backend/src/ingestion/LocationAnalyzer.ts b/plugins/catalog-backend/src/ingestion/LocationAnalyzer.ts index 61d319bf37..d574f3b299 100644 --- a/plugins/catalog-backend/src/ingestion/LocationAnalyzer.ts +++ b/plugins/catalog-backend/src/ingestion/LocationAnalyzer.ts @@ -17,12 +17,14 @@ import parseGitUrl from 'git-url-parse'; import { Entity } from '@backstage/catalog-model'; import { ScmIntegrationRegistry } from '@backstage/integration'; -import { LocationAnalyzer } from './types'; import { AnalyzeLocationRequest, AnalyzeLocationResponse, } from '@backstage/plugin-catalog-common'; -import { ScmLocationAnalyzer } from '@backstage/plugin-catalog-node'; +import { + LocationAnalyzer, + ScmLocationAnalyzer, +} from '@backstage/plugin-catalog-node'; import { LoggerService } from '@backstage/backend-plugin-api'; export class RepoLocationAnalyzer implements LocationAnalyzer { diff --git a/plugins/catalog-backend/src/ingestion/index.ts b/plugins/catalog-backend/src/ingestion/index.ts deleted file mode 100644 index a6555dd98d..0000000000 --- a/plugins/catalog-backend/src/ingestion/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export type { LocationAnalyzer } from './types'; diff --git a/plugins/catalog-backend/src/ingestion/types.ts b/plugins/catalog-backend/src/ingestion/types.ts deleted file mode 100644 index 6ca0ab259b..0000000000 --- a/plugins/catalog-backend/src/ingestion/types.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - AnalyzeLocationRequest, - AnalyzeLocationResponse, -} from '@backstage/plugin-catalog-common'; - -/** @public */ -export type LocationAnalyzer = { - /** - * Generates an entity configuration for given git repository. It's used for - * importing new component to the backstage app. - * - * @param location - Git repository to analyze and generate config for. - */ - analyzeLocation( - location: AnalyzeLocationRequest, - ): Promise; -}; diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index 2438dc9009..f305bf2d8b 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -45,6 +45,7 @@ import { EntitiesSearchFilter, EntityProvider, PlaceholderResolver, + LocationAnalyzer, ScmLocationAnalyzer, } from '@backstage/plugin-catalog-node'; import { @@ -64,7 +65,6 @@ import { yamlPlaceholderResolver, } from '../modules/core/PlaceholderProcessor'; import { defaultEntityDataParser } from '../modules/util/parse'; -import { LocationAnalyzer } from '../ingestion'; import { CatalogProcessingEngine, createRandomProcessingInterval, diff --git a/plugins/catalog-backend/src/service/CatalogPlugin.ts b/plugins/catalog-backend/src/service/CatalogPlugin.ts index dd44e20add..6171ebbc1c 100644 --- a/plugins/catalog-backend/src/service/CatalogPlugin.ts +++ b/plugins/catalog-backend/src/service/CatalogPlugin.ts @@ -20,7 +20,6 @@ import { import { Entity, Validators } from '@backstage/catalog-model'; import { CatalogBuilder, CatalogPermissionRuleInput } from './CatalogBuilder'; import { - CatalogAnalysisExtensionPoint, catalogAnalysisExtensionPoint, CatalogModelExtensionPoint, catalogModelExtensionPoint, @@ -33,6 +32,7 @@ import { CatalogProcessor, CatalogProcessorParser, EntityProvider, + LocationAnalyzer, PlaceholderResolver, ScmLocationAnalyzer, } from '@backstage/plugin-catalog-node'; @@ -96,20 +96,6 @@ class CatalogProcessingExtensionPointImpl } } -class CatalogAnalysisExtensionPointImpl - implements CatalogAnalysisExtensionPoint -{ - #locationAnalyzers = new Array(); - - addLocationAnalyzer(analyzer: ScmLocationAnalyzer): void { - this.#locationAnalyzers.push(analyzer); - } - - get locationAnalyzers() { - return this.#locationAnalyzers; - } -} - class CatalogPermissionExtensionPointImpl implements CatalogPermissionExtensionPoint { @@ -178,11 +164,19 @@ export const catalogPlugin = createBackendPlugin({ processingExtensions, ); - const analysisExtensions = new CatalogAnalysisExtensionPointImpl(); - env.registerExtensionPoint( - catalogAnalysisExtensionPoint, - analysisExtensions, - ); + let locationAnalyzer: LocationAnalyzer | undefined = undefined; + const scmLocationAnalyzers = new Array(); + env.registerExtensionPoint(catalogAnalysisExtensionPoint, { + setLocationAnalyzer(analyzer: LocationAnalyzer) { + if (locationAnalyzer) { + throw new Error('LocationAnalyzer has already been set'); + } + locationAnalyzer = analyzer; + }, + addScmLocationAnalyzer(analyzer: ScmLocationAnalyzer) { + scmLocationAnalyzers.push(analyzer); + }, + }); const permissionExtensions = new CatalogPermissionExtensionPointImpl(); env.registerExtensionPoint( @@ -246,7 +240,11 @@ export const catalogPlugin = createBackendPlugin({ Object.entries(processingExtensions.placeholderResolvers).forEach( ([key, resolver]) => builder.setPlaceholderResolver(key, resolver), ); - builder.addLocationAnalyzers(...analysisExtensions.locationAnalyzers); + if (locationAnalyzer) { + builder.setLocationAnalyzer(locationAnalyzer); + } else { + builder.addLocationAnalyzers(...scmLocationAnalyzers); + } builder.addPermissions(...permissionExtensions.permissions); builder.addPermissionRules(...permissionExtensions.permissionRules); builder.setFieldFormatValidators(modelExtensions.fieldValidators); diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts index 292c4c1b7a..a2fae0e8bd 100644 --- a/plugins/catalog-backend/src/service/createRouter.test.ts +++ b/plugins/catalog-backend/src/service/createRouter.test.ts @@ -42,7 +42,7 @@ import { decodeCursor, encodeCursor } from './util'; import { wrapInOpenApiTestServer } from '@backstage/backend-openapi-utils'; import { Server } from 'http'; import { mockCredentials, mockServices } from '@backstage/backend-test-utils'; -import { LocationAnalyzer } from '../ingestion'; +import { LocationAnalyzer } from '@backstage/plugin-catalog-node'; describe('createRouter readonly disabled', () => { let entitiesCatalog: jest.Mocked; diff --git a/plugins/catalog-backend/src/service/createRouter.ts b/plugins/catalog-backend/src/service/createRouter.ts index 508f0bb3d6..774ee61a6d 100644 --- a/plugins/catalog-backend/src/service/createRouter.ts +++ b/plugins/catalog-backend/src/service/createRouter.ts @@ -28,7 +28,6 @@ import express from 'express'; import yn from 'yn'; import { z } from 'zod'; import { EntitiesCatalog } from '../catalog/types'; -import { LocationAnalyzer } from '../ingestion'; import { CatalogProcessingOrchestrator } from '../processing/types'; import { validateEntityEnvelope } from '../processing/util'; import { @@ -55,6 +54,7 @@ import { HttpAuthService, LoggerService, } from '@backstage/backend-plugin-api'; +import { LocationAnalyzer } from '@backstage/plugin-catalog-node'; /** * Options used by {@link createRouter}. diff --git a/plugins/catalog-node/api-report-alpha.md b/plugins/catalog-node/api-report-alpha.md index fb41d6f03e..cc3f7e5fb5 100644 --- a/plugins/catalog-node/api-report-alpha.md +++ b/plugins/catalog-node/api-report-alpha.md @@ -10,6 +10,7 @@ import { EntitiesSearchFilter } from '@backstage/plugin-catalog-node'; import { Entity } from '@backstage/catalog-model'; import { EntityProvider } from '@backstage/plugin-catalog-node'; import { ExtensionPoint } from '@backstage/backend-plugin-api'; +import { LocationAnalyzer } from '@backstage/plugin-catalog-node'; import { Permission } from '@backstage/plugin-permission-common'; import { PermissionRule } from '@backstage/plugin-permission-node'; import { PermissionRuleParams } from '@backstage/plugin-permission-common'; @@ -20,8 +21,8 @@ import { Validators } from '@backstage/catalog-model'; // @alpha (undocumented) export interface CatalogAnalysisExtensionPoint { - // (undocumented) - addLocationAnalyzer(analyzer: ScmLocationAnalyzer): void; + addScmLocationAnalyzer(analyzer: ScmLocationAnalyzer): void; + setLocationAnalyzer(analyzer: LocationAnalyzer): void; } // @alpha (undocumented) diff --git a/plugins/catalog-node/api-report.md b/plugins/catalog-node/api-report.md index a4ba95073f..7c1c8b5911 100644 --- a/plugins/catalog-node/api-report.md +++ b/plugins/catalog-node/api-report.md @@ -6,6 +6,8 @@ /// import { AnalyzeLocationExistingEntity } from '@backstage/plugin-catalog-common'; +import { AnalyzeLocationRequest } from '@backstage/plugin-catalog-common'; +import { AnalyzeLocationResponse } from '@backstage/plugin-catalog-common'; import { CompoundEntityRef } from '@backstage/catalog-model'; import { Entity } from '@backstage/catalog-model'; import { JsonValue } from '@backstage/types'; @@ -166,6 +168,13 @@ export type EntityRelationSpec = { target: CompoundEntityRef; }; +// @public (undocumented) +export type LocationAnalyzer = { + analyzeLocation( + location: AnalyzeLocationRequest, + ): Promise; +}; + // @public @deprecated export type LocationSpec = LocationSpec_2; diff --git a/plugins/catalog-node/src/extensions.ts b/plugins/catalog-node/src/extensions.ts index 648b8c5974..56478ec1db 100644 --- a/plugins/catalog-node/src/extensions.ts +++ b/plugins/catalog-node/src/extensions.ts @@ -22,6 +22,7 @@ import { EntitiesSearchFilter, EntityProvider, PlaceholderResolver, + LocationAnalyzer, ScmLocationAnalyzer, } from '@backstage/plugin-catalog-node'; import { @@ -79,7 +80,16 @@ export const catalogProcessingExtensionPoint = * @alpha */ export interface CatalogAnalysisExtensionPoint { - addLocationAnalyzer(analyzer: ScmLocationAnalyzer): void; + /** + * Replaces the entire location analyzer with a new one. This will cause any + * SCM analyzers added through `addScmLocationAnalyzer` to be ignored. + */ + setLocationAnalyzer(analyzer: LocationAnalyzer): void; + + /** + * Adds an analyzer for a specific SCM type to the default location analyzer. + */ + addScmLocationAnalyzer(analyzer: ScmLocationAnalyzer): void; } /** diff --git a/plugins/catalog-node/src/processing/index.ts b/plugins/catalog-node/src/processing/index.ts index 8cffac6961..4e83e6077d 100644 --- a/plugins/catalog-node/src/processing/index.ts +++ b/plugins/catalog-node/src/processing/index.ts @@ -21,5 +21,6 @@ export type { PlaceholderResolverParams, PlaceholderResolverRead, PlaceholderResolverResolveUrl, + LocationAnalyzer, ScmLocationAnalyzer, } from './types'; diff --git a/plugins/catalog-node/src/processing/types.ts b/plugins/catalog-node/src/processing/types.ts index b6785c1b91..e3d3c305fc 100644 --- a/plugins/catalog-node/src/processing/types.ts +++ b/plugins/catalog-node/src/processing/types.ts @@ -15,7 +15,11 @@ */ import { Entity } from '@backstage/catalog-model'; -import { AnalyzeLocationExistingEntity } from '@backstage/plugin-catalog-common'; +import { + AnalyzeLocationExistingEntity, + AnalyzeLocationRequest, + AnalyzeLocationResponse, +} from '@backstage/plugin-catalog-common'; import { JsonValue } from '@backstage/types'; import { CatalogProcessorEmit } from '../api'; @@ -52,6 +56,19 @@ export type PlaceholderResolver = ( params: PlaceholderResolverParams, ) => Promise; +/** @public */ +export type LocationAnalyzer = { + /** + * Generates an entity configuration for given git repository. It's used for + * importing new component to the backstage app. + * + * @param location - Git repository to analyze and generate config for. + */ + analyzeLocation( + location: AnalyzeLocationRequest, + ): Promise; +}; + /** @public */ export type AnalyzeOptions = { url: string; From 6cc3a9f66f237dd61a1dc85760fe57340c16fe75 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 19:48:42 +0000 Subject: [PATCH 061/136] chore(deps): update peter-evans/find-comment digest to 3eae4d3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/api-breaking-changes-comment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/api-breaking-changes-comment.yml b/.github/workflows/api-breaking-changes-comment.yml index 4c7fa452e7..bc90a276f0 100644 --- a/.github/workflows/api-breaking-changes-comment.yml +++ b/.github/workflows/api-breaking-changes-comment.yml @@ -94,7 +94,7 @@ jobs: # Identify comment to be updated - name: Find comment for API Changes - uses: peter-evans/find-comment@d5fe37641ad8451bdd80312415672ba26c86575e # v3 + uses: peter-evans/find-comment@3eae4d37986fb5a8592848f6a574fdf654e61f9e # v3 id: find-comment with: issue-number: ${{ needs.setup.outputs.pr-number }} From 5a0c7cdbfa5c50ee4c5acdec26c9a2fdd852f9dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 2 May 2024 23:03:06 +0200 Subject: [PATCH 062/136] don't redo the rendering in both observable and promise MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../DefaultEntityPresentationApi.ts | 59 +++++++++---------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.ts b/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.ts index 9630c6c216..1955763d3d 100644 --- a/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.ts +++ b/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.ts @@ -267,35 +267,38 @@ export class DefaultEntityPresentationApi implements EntityPresentationApi { }; } - const loadingPromise = Promise.resolve().then(() => - this.#loader?.load(entityRef), - ); + // Load the entity and render it + const maybeUpdatedSnapshot = Promise.resolve() + .then(() => { + return this.#loader?.load(entityRef); + }) + .then(newEntity => { + // We re-render no matter if we get back a new entity or the old + // one or nothing, because of the now false loading state - in + // case the renderer outputs different data depending on that + return render({ + loading: false, + entity: newEntity ?? entity, + }); + }) + .catch(() => { + // Intentionally ignored - we do not propagate errors to the + // caller here. The presentation API should be error free and + // always return SOMETHING that makes sense to render, and we have + // already ensured above that the initial snapshot was that. + return undefined; + }); - // And then the following snapshot const observable = new ObservableImpl( subscriber => { let aborted = false; - loadingPromise - .then(newEntity => { - if ( - !aborted && - newEntity && - newEntity.metadata.etag !== entity?.metadata.etag - ) { - const updatedSnapshot = render({ - loading: false, - entity: newEntity, - }); + maybeUpdatedSnapshot + .then(updatedSnapshot => { + if (updatedSnapshot) { subscriber.next(updatedSnapshot); } }) - .catch(() => { - // Intentionally ignored - we do not propagate errors to the - // observable here. The presentation API should be error free and - // always return SOMETHING that makes sense to render, and we have - // already ensured above that the initial snapshot was that. - }) .finally(() => { if (!aborted) { subscriber.complete(); @@ -308,17 +311,9 @@ export class DefaultEntityPresentationApi implements EntityPresentationApi { }, ); - const promise = loadingPromise - .then(newEntity => { - if (newEntity && newEntity.metadata.etag !== entity?.metadata.etag) { - return render({ - loading: false, - entity: newEntity, - }); - } - return initialSnapshot; - }) - .catch(() => initialSnapshot); + const promise = maybeUpdatedSnapshot.then(updatedSnapshot => { + return updatedSnapshot ?? initialSnapshot; + }); return { snapshot: initialSnapshot, From 79a6358f50854b626d06598cbae0384e44c0b68f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 3 May 2024 10:40:49 +0200 Subject: [PATCH 063/136] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Signed-off-by: Patrik Oldsberg --- .../building-apps/02-configuring-extensions.md | 2 +- docs/frontend-system/building-apps/08-migrating.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/frontend-system/building-apps/02-configuring-extensions.md b/docs/frontend-system/building-apps/02-configuring-extensions.md index 5f090e23cd..4052ef47f0 100644 --- a/docs/frontend-system/building-apps/02-configuring-extensions.md +++ b/docs/frontend-system/building-apps/02-configuring-extensions.md @@ -6,7 +6,7 @@ sidebar_label: Configuring Extensions description: Documentation for how to configure extensions in a Backstage app --- -All extensions in a Backstage app can be configured through static configuration. This configuration is all done under a the `app.extensions` configuration key. For more general information on how to write configuration for Backstage, see the section on [writing configuration](../../conf/writing.md). +All extensions in a Backstage app can be configured through static configuration. This configuration is all done under the `app.extensions` configuration key. For more general information on how to write configuration for Backstage, see the section on [writing configuration](../../conf/writing.md). ## Extension Configuration Schema diff --git a/docs/frontend-system/building-apps/08-migrating.md b/docs/frontend-system/building-apps/08-migrating.md index 8bcc1f973f..dcc58325cf 100644 --- a/docs/frontend-system/building-apps/08-migrating.md +++ b/docs/frontend-system/building-apps/08-migrating.md @@ -117,7 +117,7 @@ You can then also add any additional extensions that you may need to create as p [Utility API](../utility-apis/01-index.md) factories are now installed as extensions instead. Pass the existing factory to `createApiExtension` and install it in the app. For more information, see the section on [configuring Utility APIs](../utility-apis/04-configuring.md). -For example, the following apis configuration: +For example, the following `apis` configuration: ```ts const app = createApp({ @@ -151,7 +151,7 @@ Icons are currently installed through the usual options to `createApp`, but will Plugins are now passed through the `features` options instead. -For example, the following plugins configuration: +For example, the following `plugins` configuration: ```tsx import { homePlugin } from '@backstage/plugin-home'; @@ -163,7 +163,7 @@ createApp({ }); ``` -Can be converted to the following features configuration: +Can be converted to the following `features` configuration: ```tsx // plugins are now default exported via alpha subpath From ae500129a9146c600453de465103f917b5fbbcb4 Mon Sep 17 00:00:00 2001 From: Nitin Ramnani Date: Fri, 3 May 2024 14:49:01 +0530 Subject: [PATCH 064/136] Added stories for multiple components Signed-off-by: Nitin Ramnani --- .../HeaderIconLinkRow.stories.tsx | 51 ++++++++++++++++ .../ResponseErrorPanel.stories.tsx | 38 ++++++++++++ .../layout/BottomLink/BottomLink.stories.tsx | 33 +++++++++++ .../ContentHeader/ContentHeader.stories.tsx | 58 +++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 packages/core-components/src/components/HeaderIconLinkRow/HeaderIconLinkRow.stories.tsx create mode 100644 packages/core-components/src/components/ResponseErrorPanel/ResponseErrorPanel.stories.tsx create mode 100644 packages/core-components/src/layout/BottomLink/BottomLink.stories.tsx create mode 100644 packages/core-components/src/layout/ContentHeader/ContentHeader.stories.tsx diff --git a/packages/core-components/src/components/HeaderIconLinkRow/HeaderIconLinkRow.stories.tsx b/packages/core-components/src/components/HeaderIconLinkRow/HeaderIconLinkRow.stories.tsx new file mode 100644 index 0000000000..e6891081e3 --- /dev/null +++ b/packages/core-components/src/components/HeaderIconLinkRow/HeaderIconLinkRow.stories.tsx @@ -0,0 +1,51 @@ +/* + * Copyright 2024 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 { HeaderIconLinkRow } from '../HeaderIconLinkRow'; +import { IconLinkVerticalProps } from './IconLinkVertical'; + + +type Props = { + links: IconLinkVerticalProps[]; + }; + +export default { + title: 'Data Display/HeaderIconLinkRow', + component: HeaderIconLinkRow, +}; + + + +export const Default = (args:Props) => +Default.args = { + links: [ + { + color: 'primary', + disabled: false, + href: "https://google.com", + label: "primary", + title: "title" + }, + { + color: 'secondary', + disabled: false, + href: "https://google.com", + label: "secondary", + title: "title-2" + }, + ] +}; \ No newline at end of file diff --git a/packages/core-components/src/components/ResponseErrorPanel/ResponseErrorPanel.stories.tsx b/packages/core-components/src/components/ResponseErrorPanel/ResponseErrorPanel.stories.tsx new file mode 100644 index 0000000000..62eb523a02 --- /dev/null +++ b/packages/core-components/src/components/ResponseErrorPanel/ResponseErrorPanel.stories.tsx @@ -0,0 +1,38 @@ +/* + * Copyright 2024 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 { ResponseErrorPanel } from '../ResponseErrorPanel'; +import { ErrorPanelProps } from '../ErrorPanel'; + +export default { + title: 'Data Display/ResponseErrorPanel', + component: ResponseErrorPanel, +}; + +export const Default = (args:ErrorPanelProps) => +Default.args = { + error: new Error('Error message from error object'), + defaultExpanded: false +}; + + +export const WithTitle = (args:ErrorPanelProps) => +WithTitle.args = { + error: new Error('test'), + defaultExpanded: false, + title:"Title prop is passed" +}; diff --git a/packages/core-components/src/layout/BottomLink/BottomLink.stories.tsx b/packages/core-components/src/layout/BottomLink/BottomLink.stories.tsx new file mode 100644 index 0000000000..84f268681d --- /dev/null +++ b/packages/core-components/src/layout/BottomLink/BottomLink.stories.tsx @@ -0,0 +1,33 @@ +/* + * Copyright 2024 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 { BottomLink } from '../BottomLink'; + +export default { + title: 'Layout/BottomLink', + component: BottomLink, +}; + +export const Default = (args:{ + link:string + title:string +}) => +Default.args = { + link: 'https://google.com', + title: 'This is bottom link' +}; diff --git a/packages/core-components/src/layout/ContentHeader/ContentHeader.stories.tsx b/packages/core-components/src/layout/ContentHeader/ContentHeader.stories.tsx new file mode 100644 index 0000000000..ce6365c28e --- /dev/null +++ b/packages/core-components/src/layout/ContentHeader/ContentHeader.stories.tsx @@ -0,0 +1,58 @@ +/* + * Copyright 2024 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 , {ReactNode} from 'react'; +import { ContentHeader } from '../ContentHeader'; + +export default { + title: 'Layout/ContentHeader', + component: ContentHeader, +}; + +type ContentHeaderProps = { + title?: string + titleComponent?: ReactNode; + description?: string; + textAlign?: 'left' | 'right' | 'center'; + }; + +export const Default = (args:ContentHeaderProps) =>
Child of Content Header
+Default.args = { + title: 'This is Content Header default aligned', + description:'This is description' +}; + + +export const Left = (args:ContentHeaderProps) =>
Child of Content Header
+Left.args = { + title: 'This is Content Header left aligned', + description:'This is description', + textAlign: 'left' +}; + +export const Right = (args:ContentHeaderProps) =>
Child of Content Header
+Right.args = { + title: 'This is Content Header right aligned', + description:'This is description', + textAlign: 'right' +}; + +export const Center = (args:ContentHeaderProps) =>
Child of Content Header
+Center.args = { + title: 'This is Content Header center aligned', + description:'This is description', + textAlign: 'center' +}; From baf298f57ec2a6fe1b43dd584cf78f2e0c959467 Mon Sep 17 00:00:00 2001 From: Nitin Ramnani Date: Fri, 3 May 2024 14:52:20 +0530 Subject: [PATCH 065/136] Added stories for multiple components Signed-off-by: Nitin Ramnani --- .../HeaderIconLinkRow.stories.tsx | 49 +++++++-------- .../ResponseErrorPanel.stories.tsx | 23 ++++--- .../layout/BottomLink/BottomLink.stories.tsx | 16 +++-- .../ContentHeader/ContentHeader.stories.tsx | 63 ++++++++++++------- 4 files changed, 82 insertions(+), 69 deletions(-) diff --git a/packages/core-components/src/components/HeaderIconLinkRow/HeaderIconLinkRow.stories.tsx b/packages/core-components/src/components/HeaderIconLinkRow/HeaderIconLinkRow.stories.tsx index e6891081e3..e472ab5599 100644 --- a/packages/core-components/src/components/HeaderIconLinkRow/HeaderIconLinkRow.stories.tsx +++ b/packages/core-components/src/components/HeaderIconLinkRow/HeaderIconLinkRow.stories.tsx @@ -18,34 +18,31 @@ import React from 'react'; import { HeaderIconLinkRow } from '../HeaderIconLinkRow'; import { IconLinkVerticalProps } from './IconLinkVertical'; - type Props = { - links: IconLinkVerticalProps[]; - }; - -export default { - title: 'Data Display/HeaderIconLinkRow', - component: HeaderIconLinkRow, + links: IconLinkVerticalProps[]; }; +export default { + title: 'Data Display/HeaderIconLinkRow', + component: HeaderIconLinkRow, +}; - -export const Default = (args:Props) => +export const Default = (args: Props) => ; Default.args = { - links: [ - { - color: 'primary', - disabled: false, - href: "https://google.com", - label: "primary", - title: "title" - }, - { - color: 'secondary', - disabled: false, - href: "https://google.com", - label: "secondary", - title: "title-2" - }, - ] -}; \ No newline at end of file + links: [ + { + color: 'primary', + disabled: false, + href: 'https://google.com', + label: 'primary', + title: 'title', + }, + { + color: 'secondary', + disabled: false, + href: 'https://google.com', + label: 'secondary', + title: 'title-2', + }, + ], +}; diff --git a/packages/core-components/src/components/ResponseErrorPanel/ResponseErrorPanel.stories.tsx b/packages/core-components/src/components/ResponseErrorPanel/ResponseErrorPanel.stories.tsx index 62eb523a02..8d03e7359f 100644 --- a/packages/core-components/src/components/ResponseErrorPanel/ResponseErrorPanel.stories.tsx +++ b/packages/core-components/src/components/ResponseErrorPanel/ResponseErrorPanel.stories.tsx @@ -19,20 +19,23 @@ import { ResponseErrorPanel } from '../ResponseErrorPanel'; import { ErrorPanelProps } from '../ErrorPanel'; export default { - title: 'Data Display/ResponseErrorPanel', - component: ResponseErrorPanel, + title: 'Data Display/ResponseErrorPanel', + component: ResponseErrorPanel, }; -export const Default = (args:ErrorPanelProps) => +export const Default = (args: ErrorPanelProps) => ( + +); Default.args = { - error: new Error('Error message from error object'), - defaultExpanded: false + error: new Error('Error message from error object'), + defaultExpanded: false, }; - -export const WithTitle = (args:ErrorPanelProps) => +export const WithTitle = (args: ErrorPanelProps) => ( + +); WithTitle.args = { - error: new Error('test'), - defaultExpanded: false, - title:"Title prop is passed" + error: new Error('test'), + defaultExpanded: false, + title: 'Title prop is passed', }; diff --git a/packages/core-components/src/layout/BottomLink/BottomLink.stories.tsx b/packages/core-components/src/layout/BottomLink/BottomLink.stories.tsx index 84f268681d..e05af86993 100644 --- a/packages/core-components/src/layout/BottomLink/BottomLink.stories.tsx +++ b/packages/core-components/src/layout/BottomLink/BottomLink.stories.tsx @@ -14,20 +14,18 @@ * limitations under the License. */ - import React from 'react'; import { BottomLink } from '../BottomLink'; export default { - title: 'Layout/BottomLink', - component: BottomLink, + title: 'Layout/BottomLink', + component: BottomLink, }; -export const Default = (args:{ - link:string - title:string -}) => +export const Default = (args: { link: string; title: string }) => ( + +); Default.args = { - link: 'https://google.com', - title: 'This is bottom link' + link: 'https://google.com', + title: 'This is bottom link', }; diff --git a/packages/core-components/src/layout/ContentHeader/ContentHeader.stories.tsx b/packages/core-components/src/layout/ContentHeader/ContentHeader.stories.tsx index ce6365c28e..27df00e72c 100644 --- a/packages/core-components/src/layout/ContentHeader/ContentHeader.stories.tsx +++ b/packages/core-components/src/layout/ContentHeader/ContentHeader.stories.tsx @@ -14,45 +14,60 @@ * limitations under the License. */ -import React , {ReactNode} from 'react'; +import React, { ReactNode } from 'react'; import { ContentHeader } from '../ContentHeader'; export default { - title: 'Layout/ContentHeader', - component: ContentHeader, + title: 'Layout/ContentHeader', + component: ContentHeader, }; type ContentHeaderProps = { - title?: string - titleComponent?: ReactNode; - description?: string; - textAlign?: 'left' | 'right' | 'center'; - }; + title?: string; + titleComponent?: ReactNode; + description?: string; + textAlign?: 'left' | 'right' | 'center'; +}; -export const Default = (args:ContentHeaderProps) =>
Child of Content Header
+export const Default = (args: ContentHeaderProps) => ( + +
Child of Content Header
+
+); Default.args = { - title: 'This is Content Header default aligned', - description:'This is description' + title: 'This is Content Header default aligned', + description: 'This is description', }; - -export const Left = (args:ContentHeaderProps) =>
Child of Content Header
+export const Left = (args: ContentHeaderProps) => ( + +
Child of Content Header
+
+); Left.args = { - title: 'This is Content Header left aligned', - description:'This is description', - textAlign: 'left' + title: 'This is Content Header left aligned', + description: 'This is description', + textAlign: 'left', }; -export const Right = (args:ContentHeaderProps) =>
Child of Content Header
+export const Right = (args: ContentHeaderProps) => ( + +
Child of Content Header
+
+); Right.args = { - title: 'This is Content Header right aligned', - description:'This is description', - textAlign: 'right' + title: 'This is Content Header right aligned', + description: 'This is description', + textAlign: 'right', }; -export const Center = (args:ContentHeaderProps) =>
Child of Content Header
+export const Center = (args: ContentHeaderProps) => ( + +
Child of Content Header
+
+); Center.args = { - title: 'This is Content Header center aligned', - description:'This is description', - textAlign: 'center' + title: 'This is Content Header center aligned', + description: 'This is description', + textAlign: 'center', }; From 2e20518cd2d16940fff1f8069e43593e0702e86a Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 3 May 2024 11:43:07 +0200 Subject: [PATCH 066/136] catalog-node: allow location analyzer to be configured as a factory as well Signed-off-by: Patrik Oldsberg --- .../src/service/CatalogPlugin.ts | 26 +++++++++++++++---- plugins/catalog-node/api-report-alpha.md | 8 +++++- plugins/catalog-node/src/extensions.ts | 17 +++++++++--- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/plugins/catalog-backend/src/service/CatalogPlugin.ts b/plugins/catalog-backend/src/service/CatalogPlugin.ts index 6171ebbc1c..ac869cdc2b 100644 --- a/plugins/catalog-backend/src/service/CatalogPlugin.ts +++ b/plugins/catalog-backend/src/service/CatalogPlugin.ts @@ -38,6 +38,7 @@ import { } from '@backstage/plugin-catalog-node'; import { merge } from 'lodash'; import { Permission } from '@backstage/plugin-permission-common'; +import { ForwardedError } from '@backstage/errors'; class CatalogProcessingExtensionPointImpl implements CatalogProcessingExtensionPoint @@ -164,14 +165,24 @@ export const catalogPlugin = createBackendPlugin({ processingExtensions, ); - let locationAnalyzer: LocationAnalyzer | undefined = undefined; + let locationAnalyzerFactory: + | ((options: { + scmLocationAnalyzers: ScmLocationAnalyzer[]; + }) => Promise<{ locationAnalyzer: LocationAnalyzer }>) + | undefined = undefined; const scmLocationAnalyzers = new Array(); env.registerExtensionPoint(catalogAnalysisExtensionPoint, { - setLocationAnalyzer(analyzer: LocationAnalyzer) { - if (locationAnalyzer) { + setLocationAnalyzer(analyzerOrFactory) { + if (locationAnalyzerFactory) { throw new Error('LocationAnalyzer has already been set'); } - locationAnalyzer = analyzer; + if (typeof analyzerOrFactory === 'function') { + locationAnalyzerFactory = analyzerOrFactory; + } else { + locationAnalyzerFactory = async () => ({ + locationAnalyzer: analyzerOrFactory, + }); + } }, addScmLocationAnalyzer(analyzer: ScmLocationAnalyzer) { scmLocationAnalyzers.push(analyzer); @@ -240,7 +251,12 @@ export const catalogPlugin = createBackendPlugin({ Object.entries(processingExtensions.placeholderResolvers).forEach( ([key, resolver]) => builder.setPlaceholderResolver(key, resolver), ); - if (locationAnalyzer) { + if (locationAnalyzerFactory) { + const { locationAnalyzer } = await locationAnalyzerFactory({ + scmLocationAnalyzers, + }).catch(e => { + throw new ForwardedError('Failed to create LocationAnalyzer', e); + }); builder.setLocationAnalyzer(locationAnalyzer); } else { builder.addLocationAnalyzers(...scmLocationAnalyzers); diff --git a/plugins/catalog-node/api-report-alpha.md b/plugins/catalog-node/api-report-alpha.md index cc3f7e5fb5..b61d1b1d27 100644 --- a/plugins/catalog-node/api-report-alpha.md +++ b/plugins/catalog-node/api-report-alpha.md @@ -22,7 +22,13 @@ import { Validators } from '@backstage/catalog-model'; // @alpha (undocumented) export interface CatalogAnalysisExtensionPoint { addScmLocationAnalyzer(analyzer: ScmLocationAnalyzer): void; - setLocationAnalyzer(analyzer: LocationAnalyzer): void; + setLocationAnalyzer( + analyzerOrFactory: + | LocationAnalyzer + | ((options: { scmLocationAnalyzers: ScmLocationAnalyzer[] }) => Promise<{ + locationAnalyzer: LocationAnalyzer; + }>), + ): void; } // @alpha (undocumented) diff --git a/plugins/catalog-node/src/extensions.ts b/plugins/catalog-node/src/extensions.ts index 56478ec1db..7c1fe6c30d 100644 --- a/plugins/catalog-node/src/extensions.ts +++ b/plugins/catalog-node/src/extensions.ts @@ -81,10 +81,21 @@ export const catalogProcessingExtensionPoint = */ export interface CatalogAnalysisExtensionPoint { /** - * Replaces the entire location analyzer with a new one. This will cause any - * SCM analyzers added through `addScmLocationAnalyzer` to be ignored. + * Replaces the entire location analyzer with a new one. + * + * @remarks + * + * By providing a factory function you can access all the SCM analyzers that + * have been added through `addScmLocationAnalyzer`. If you provide a + * `LocationAnalyzer` directly, the SCM analyzers will be ignored. */ - setLocationAnalyzer(analyzer: LocationAnalyzer): void; + setLocationAnalyzer( + analyzerOrFactory: + | LocationAnalyzer + | ((options: { + scmLocationAnalyzers: ScmLocationAnalyzer[]; + }) => Promise<{ locationAnalyzer: LocationAnalyzer }>), + ): void; /** * Adds an analyzer for a specific SCM type to the default location analyzer. From 42eaf63a7525f7bce09838f78d29abfc196680ca Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Fri, 3 May 2024 12:27:52 +0300 Subject: [PATCH 067/136] feat: increase default and allow changing snackbar auto hide duration Signed-off-by: Heikki Hellgren --- .changeset/perfect-beers-explode.md | 5 +++++ plugins/notifications/api-report.md | 1 + .../NotificationsSideBarItem/NotificationsSideBarItem.tsx | 5 +++++ 3 files changed, 11 insertions(+) create mode 100644 .changeset/perfect-beers-explode.md diff --git a/.changeset/perfect-beers-explode.md b/.changeset/perfect-beers-explode.md new file mode 100644 index 0000000000..3045ca7f12 --- /dev/null +++ b/.changeset/perfect-beers-explode.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications': patch +--- + +Increase default and allow modifying notification snackbar auto hide duration diff --git a/plugins/notifications/api-report.md b/plugins/notifications/api-report.md index 3699aa1bb0..9240bdb1c2 100644 --- a/plugins/notifications/api-report.md +++ b/plugins/notifications/api-report.md @@ -102,6 +102,7 @@ export const NotificationsSidebarItem: (props?: { webNotificationsEnabled?: boolean; titleCounterEnabled?: boolean; snackbarEnabled?: boolean; + snackbarAutoHideDuration?: number | null; className?: string; icon?: IconComponent; text?: string; diff --git a/plugins/notifications/src/components/NotificationsSideBarItem/NotificationsSideBarItem.tsx b/plugins/notifications/src/components/NotificationsSideBarItem/NotificationsSideBarItem.tsx index 000eabcae6..7b55c63747 100644 --- a/plugins/notifications/src/components/NotificationsSideBarItem/NotificationsSideBarItem.tsx +++ b/plugins/notifications/src/components/NotificationsSideBarItem/NotificationsSideBarItem.tsx @@ -83,6 +83,7 @@ export const NotificationsSidebarItem = (props?: { webNotificationsEnabled?: boolean; titleCounterEnabled?: boolean; snackbarEnabled?: boolean; + snackbarAutoHideDuration?: number | null; className?: string; icon?: IconComponent; text?: string; @@ -93,6 +94,7 @@ export const NotificationsSidebarItem = (props?: { webNotificationsEnabled = false, titleCounterEnabled = true, snackbarEnabled = true, + snackbarAutoHideDuration = 10000, icon = NotificationsIcon, text = 'Notifications', ...restProps @@ -100,6 +102,7 @@ export const NotificationsSidebarItem = (props?: { webNotificationsEnabled: false, titleCounterEnabled: true, snackbarEnabled: true, + snackbarAutoHideDuration: 10000, }; const { loading, error, value, retry } = useNotificationsApi(api => @@ -196,6 +199,7 @@ export const NotificationsSidebarItem = (props?: { variant: notification.payload.severity, anchorOrigin: { vertical: 'bottom', horizontal: 'right' }, action, + autoHideDuration: snackbarAutoHideDuration, } as OptionsWithExtraProps); } }) @@ -216,6 +220,7 @@ export const NotificationsSidebarItem = (props?: { sendWebNotification, webNotificationsEnabled, snackbarEnabled, + snackbarAutoHideDuration, notificationsApi, alertApi, getSnackbarProperties, From 762141c019ee9406f8b3a223d686d7632849cfea Mon Sep 17 00:00:00 2001 From: Jeeva Ramanathan Date: Fri, 3 May 2024 17:50:30 +0530 Subject: [PATCH 068/136] is able to be set as required Signed-off-by: Jeeva Ramanathan --- .changeset/sixty-bears-camp.md | 5 +++++ .../fields/MultiEntityPicker/MultiEntityPicker.tsx | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .changeset/sixty-bears-camp.md diff --git a/.changeset/sixty-bears-camp.md b/.changeset/sixty-bears-camp.md new file mode 100644 index 0000000000..ff6179c06f --- /dev/null +++ b/.changeset/sixty-bears-camp.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': minor +--- + +`MultiEntityPicker` is able to be set as required diff --git a/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx b/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx index d9804a8cba..8f17bf1ea6 100644 --- a/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx +++ b/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx @@ -173,7 +173,10 @@ export const MultiEntityPicker = (props: MultiEntityPickerProps) => { FormHelperTextProps={{ margin: 'dense', style: { marginLeft: 0 } }} variant="outlined" required={required} - InputProps={params.InputProps} + InputProps={{ + ...params.InputProps, + required: formData.length === 0 && required, + }} /> )} /> From 598e8e51dd3430702f05c0f89c33215a0c49ebf3 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 3 May 2024 14:09:58 +0200 Subject: [PATCH 069/136] root: patch changesets to handle workspace ranges differently Signed-off-by: Patrik Oldsberg --- ...le-release-plan-npm-6.0.0-f7b3005037.patch | 32 +++++++++++++++++++ package.json | 1 + yarn.lock | 16 +++++++++- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 .yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch diff --git a/.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch b/.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch new file mode 100644 index 0000000000..045e983dbe --- /dev/null +++ b/.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch @@ -0,0 +1,32 @@ +diff --git a/dist/changesets-assemble-release-plan.cjs.js b/dist/changesets-assemble-release-plan.cjs.js +index ee5c0f67fabadeb112e9f238d8b144a4d125830f..9b0e1a156dd88cee35f82faf718d82a8a8f80325 100644 +--- a/dist/changesets-assemble-release-plan.cjs.js ++++ b/dist/changesets-assemble-release-plan.cjs.js +@@ -179,12 +179,23 @@ function getDependencyVersionRanges(dependentPkgJSON, dependencyRelease) { + if (!versionRange) continue; + + if (versionRange.startsWith("workspace:")) { ++ // intentionally keep other workspace ranges untouched ++ // this has to be fixed but this should only be done when adding appropriate tests ++ let workspaceRange = versionRange.replace(/^workspace:/, ""); ++ switch (workspaceRange) { ++ case "*": ++ // workspace:* actually means the current exact version, and not a wildcard similar to a reguler * range ++ workspaceRange = dependencyRelease.oldVersion; ++ break; ++ case "~": ++ case "^": ++ // Use ^oldVersion for workspace:^ or ~oldVersion for workspace:~. ++ // The version range might have changed in dependent package, but that should have its own changeset bumping that package. ++ workspaceRange += dependencyRelease.oldVersion; ++ } + dependencyVersionRanges.push({ + depType: type, +- versionRange: // intentionally keep other workspace ranges untouched +- // this has to be fixed but this should only be done when adding appropriate tests +- versionRange === "workspace:*" ? // workspace:* actually means the current exact version, and not a wildcard similar to a reguler * range +- dependencyRelease.oldVersion : versionRange.replace(/^workspace:/, "") ++ versionRange: workspaceRange, + }); + } else { + dependencyVersionRanges.push({ diff --git a/package.json b/package.json index 5d9fbef716..768448402f 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,7 @@ }, "prettier": "@spotify/prettier-config", "resolutions": { + "@changesets/assemble-release-plan@^6.0.0": "patch:@changesets/assemble-release-plan@npm%3A6.0.0#./.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch", "@material-ui/pickers@^3.2.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch", "@material-ui/pickers@^3.3.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch", "@types/react": "^18", diff --git a/yarn.lock b/yarn.lock index c07c71c8b3..dbc233dd64 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7817,7 +7817,7 @@ __metadata: languageName: node linkType: hard -"@changesets/assemble-release-plan@npm:^6.0.0": +"@changesets/assemble-release-plan@npm:6.0.0": version: 6.0.0 resolution: "@changesets/assemble-release-plan@npm:6.0.0" dependencies: @@ -7831,6 +7831,20 @@ __metadata: languageName: node linkType: hard +"@changesets/assemble-release-plan@patch:@changesets/assemble-release-plan@npm%3A6.0.0#./.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch::locator=root%40workspace%3A.": + version: 6.0.0 + resolution: "@changesets/assemble-release-plan@patch:@changesets/assemble-release-plan@npm%3A6.0.0#./.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch::version=6.0.0&hash=43c5e4&locator=root%40workspace%3A." + dependencies: + "@babel/runtime": ^7.20.1 + "@changesets/errors": ^0.2.0 + "@changesets/get-dependents-graph": ^2.0.0 + "@changesets/types": ^6.0.0 + "@manypkg/get-packages": ^1.1.3 + semver: ^7.5.3 + checksum: b7a68e28d03379bdc2a1d7171963990e1b88d0e5efca5f5ed490c0f583d66d0ccbd4c04ebf4e5cd1c38e1346ff0e5c4c16e1b4973cdd97fabdbad0c6996fe016 + languageName: node + linkType: hard + "@changesets/changelog-git@npm:^0.2.0": version: 0.2.0 resolution: "@changesets/changelog-git@npm:0.2.0" From b50a7a48086205d65815c53f8bb622724a034cba Mon Sep 17 00:00:00 2001 From: Nitin Ramnani Date: Fri, 3 May 2024 18:17:04 +0530 Subject: [PATCH 070/136] Added stories for multiple components Signed-off-by: Nitin Ramnani --- .../src/layout/Content/Content.stories.tsx | 50 +++++++++++++++++++ .../HeaderActionMenu.stories.tsx | 45 +++++++++++++++++ .../HeaderLabel/HeaderLabel.stories.tsx | 35 +++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 packages/core-components/src/layout/Content/Content.stories.tsx create mode 100644 packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx create mode 100644 packages/core-components/src/layout/HeaderLabel/HeaderLabel.stories.tsx diff --git a/packages/core-components/src/layout/Content/Content.stories.tsx b/packages/core-components/src/layout/Content/Content.stories.tsx new file mode 100644 index 0000000000..de1b17de0f --- /dev/null +++ b/packages/core-components/src/layout/Content/Content.stories.tsx @@ -0,0 +1,50 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React, { ReactNode } from 'react'; +import { Content } from './Content'; + +export default { + title: 'Layout/Content', + component: Content, +}; + +type Props = { + stretch?: boolean; + noPadding?: boolean; + className?: string; +}; + +export const Default = (args: Props) => ( + +
This is child of content component
+
+); + +Default.args = { + stretch: false, + noPadding: false, +}; + +export const WithNoPadding = (args: Props) => ( + +
This is child of content component
+
+); + +WithNoPadding.args = { + stretch: true, + noPadding: true, +}; diff --git a/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx b/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx new file mode 100644 index 0000000000..0d185aeb11 --- /dev/null +++ b/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx @@ -0,0 +1,45 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { HeaderActionMenu, HeaderActionMenuProps } from './HeaderActionMenu'; + +export default { + title: 'Layout/HeaderActionMenu', + component: HeaderActionMenu, +}; + +export const Default = (args: HeaderActionMenuProps) => ( + +); +Default.args = { + actionItems: [ + { + label: 'Item 1', + secondaryLabel: 'Item 1 secondary label', + disabled: false, + }, + { + label: 'Item 2', + secondaryLabel: 'Item 2 secondary label', + disabled: true, + }, + { + label: 'Item 3', + secondaryLabel: 'Item 3 secondary label', + disabled: true, + }, + ], +}; diff --git a/packages/core-components/src/layout/HeaderLabel/HeaderLabel.stories.tsx b/packages/core-components/src/layout/HeaderLabel/HeaderLabel.stories.tsx new file mode 100644 index 0000000000..80baa83a4f --- /dev/null +++ b/packages/core-components/src/layout/HeaderLabel/HeaderLabel.stories.tsx @@ -0,0 +1,35 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { HeaderLabel } from './HeaderLabel'; + +export default { + title: 'Layout/HeaderLabel', + component: HeaderLabel, +}; + +type HeaderLabelProps = { + label: string; + value?: string; + url?: string; +}; + +export const Default = (args: HeaderLabelProps) => ; +Default.args = { + label: 'This is label', + value: 'This is value', + url: 'https://backstage.io', +}; From c27808698f689fca403056be2007df23b6c9f7ca Mon Sep 17 00:00:00 2001 From: Nitin Ramnani Date: Fri, 3 May 2024 18:32:54 +0530 Subject: [PATCH 071/136] Added stories for multiple components Signed-off-by: Nitin Ramnani --- packages/core-components/src/layout/Content/Content.stories.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-components/src/layout/Content/Content.stories.tsx b/packages/core-components/src/layout/Content/Content.stories.tsx index de1b17de0f..f8bf055145 100644 --- a/packages/core-components/src/layout/Content/Content.stories.tsx +++ b/packages/core-components/src/layout/Content/Content.stories.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { ReactNode } from 'react'; +import React from 'react'; import { Content } from './Content'; export default { From 686e31b9614112cdd3ff20636464659de8de9511 Mon Sep 17 00:00:00 2001 From: cmoulliard Date: Fri, 3 May 2024 15:03:06 +0200 Subject: [PATCH 072/136] Refactoring the documentation to cover first the new backend system and at the end the legacy Signed-off-by: cmoulliard --- .../software-templates/writing-templates.md | 64 +++++++++---------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index 766a58d01b..f64925068a 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -744,51 +744,31 @@ The `projectSlug` filter generates a project slug from a repository URL ## Custom Filters Whenever it is needed to extend the built-in filters with yours `${{ parameters.name | my-filter1 | my-filter2 | etc }}`, then you can add them -using the property `addTemplateFilters` that you typically define using the `createRouter()` function of the `Scaffolder plugin` +using the property `additionalTemplateFilters`. -```ts title="packages/backend/src/plugins/scaffolder.ts" -export default async function createPlugin({ - logger, - config, -}: PluginEnvironment): Promise { - ... - return await createRouter({ - logger, - config, - - additionalTemplateFilters: { - - } - }); -``` - -The `addTemplateFilters` property accepts a `Record` +The `additionalTemplateFilters` property accepts as type a `Record` ```ts title="plugins/scaffolder-backend/src/service/Router.ts" additionalTemplateFilters?: Record; ``` -where the first parameter is the name of the filter and the second `TemplateFilter` receives a list of `JSON value` arguments. The `templateFilter()` function must return a JsonValue (Json array, object or primitive). +where the first parameter is the name of the filter and the second receives a list of `JSON value` arguments. The `templateFilter()` function must return a JsonValue which is either a Json array, object or primitive. ```ts title="plugins/scaffolder-node/src/types.ts" export type TemplateFilter = (...args: JsonValue[]) => JsonValue | undefined; ``` -From a practical coding point of view, you will translate that into the following snippet code +From a practical coding point of view, you will translate that into the following snippet code handling 2 filters: -```ts title="packages/backend/src/plugins/scaffolder.ts" +```ts" ... - return await createRouter({ - logger: env.logger, - config: env.config, - additionalTemplateFilters: { - base64: (...args: JsonValue[]) => btoa(args.join("")), - betterFilter: (...args: JsonValue[]) => { return `This is a much better string than "${args}", don't you think?` } - }, -}); +additionalTemplateFilters: { + base64: (...args: JsonValue[]) => btoa(args.join("")), + betterFilter: (...args: JsonValue[]) => { return `This is a much better string than "${args}", don't you think?` } +} ``` -And within your template, you will be able to use the filters like this +And within your template, you will be able to use the filters using a parameter and the filter passed using the pipe symbol ```yaml apiVersion: scaffolder.backstage.io/v1beta3 @@ -815,13 +795,11 @@ spec: message: ${{ parameters.userName | betterFilter | base64 }} ``` -### Register Custom Filters with the New Backend System - -To register the custom filters using the new Backend System, you will have to create a [backend module](../../backend-system/architecture/06-modules.md) calling following extension point: `scaffolderTemplatingExtensionPoint`. +Next, you will have to register the property `addTemplateFilters` using the `scaffolderTemplatingExtensionPoint` of a new `BackendModule` [created](../../backend-system/architecture/06-modules.md). Here is a very simplified example of how to do that: -```ts title="packages/backend/src/index.ts" +```ts title="packages/backend-next/src/index.ts" /* highlight-add-start */ import { scaffolderTemplatingExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; import { createBackendModule } from '@backstage/backend-plugin-api'; @@ -855,3 +833,21 @@ backend.add(import('@backstage/plugin-scaffolder-backend/alpha')); /* highlight-add-next-line */ backend.add(scaffolderModuleCustomFilters()); ``` + +If you still use the legacy backend system, then you will use the `createRouter()` function of the `Scaffolder plugin` + +```ts title="packages/backend/src/plugins/scaffolder.ts" +export default async function createPlugin({ + logger, + config, +}: PluginEnvironment): Promise { + ... + return await createRouter({ + logger, + config, + + additionalTemplateFilters: { + + } + }); +``` From ece858b60957a8372aa89eab2abe12e46f541bb1 Mon Sep 17 00:00:00 2001 From: Jack Palmer Date: Fri, 3 May 2024 14:20:46 +0100 Subject: [PATCH 073/136] fix: Add config.d.ts for auth-backend-module-github-provider Signed-off-by: Jack Palmer --- .../config.d.ts | 34 +++++++++++++++++++ .../package.json | 30 ++++++++-------- 2 files changed, 50 insertions(+), 14 deletions(-) create mode 100644 plugins/auth-backend-module-github-provider/config.d.ts diff --git a/plugins/auth-backend-module-github-provider/config.d.ts b/plugins/auth-backend-module-github-provider/config.d.ts new file mode 100644 index 0000000000..c8af7eb5db --- /dev/null +++ b/plugins/auth-backend-module-github-provider/config.d.ts @@ -0,0 +1,34 @@ +/* + * 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 interface Config { + auth?: { + providers?: { + /** @visibility frontend */ + github?: { + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + callbackUrl?: string; + enterpriseInstanceUrl?: string; + }; + }; + }; + }; +} diff --git a/plugins/auth-backend-module-github-provider/package.json b/plugins/auth-backend-module-github-provider/package.json index 65217f0eeb..0e8db4d1a5 100644 --- a/plugins/auth-backend-module-github-provider/package.json +++ b/plugins/auth-backend-module-github-provider/package.json @@ -1,10 +1,10 @@ { "name": "@backstage/plugin-auth-backend-module-github-provider", - "description": "The github-provider backend module for the auth plugin.", "version": "0.1.15-next.1", - "main": "src/index.ts", - "types": "src/index.ts", - "license": "Apache-2.0", + "description": "The github-provider backend module for the auth plugin.", + "backstage": { + "role": "backend-plugin-module" + }, "publishConfig": { "access": "public", "main": "dist/index.cjs.js", @@ -15,17 +15,21 @@ "url": "https://github.com/backstage/backstage", "directory": "plugins/auth-backend-module-github-provider" }, - "backstage": { - "role": "backend-plugin-module" - }, + "license": "Apache-2.0", + "main": "src/index.ts", + "types": "src/index.ts", + "files": [ + "dist", + "config.d.ts" + ], "scripts": { - "start": "backstage-cli package start", "build": "backstage-cli package build", - "lint": "backstage-cli package lint", - "test": "backstage-cli package test", "clean": "backstage-cli package clean", + "lint": "backstage-cli package lint", "prepack": "backstage-cli package prepack", - "postpack": "backstage-cli package postpack" + "postpack": "backstage-cli package postpack", + "start": "backstage-cli package start", + "test": "backstage-cli package test" }, "dependencies": { "@backstage/backend-plugin-api": "workspace:^", @@ -39,7 +43,5 @@ "@backstage/plugin-auth-backend": "workspace:^", "supertest": "^6.3.3" }, - "files": [ - "dist" - ] + "configSchema": "config.d.ts" } From e4fb486a3edc86617eaccd95f601323e0b983d0a Mon Sep 17 00:00:00 2001 From: Jack Palmer Date: Fri, 3 May 2024 14:23:11 +0100 Subject: [PATCH 074/136] chore: add changeset Signed-off-by: Jack Palmer --- .changeset/blue-balloons-draw.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/blue-balloons-draw.md diff --git a/.changeset/blue-balloons-draw.md b/.changeset/blue-balloons-draw.md new file mode 100644 index 0000000000..8208af5105 --- /dev/null +++ b/.changeset/blue-balloons-draw.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend-module-github-provider': patch +--- + +fix: Add missing config.d.ts for auth-backend-module-github-provider From 8f6a945b0ee0b33bc32dbce0bccd5e53c68ef0d6 Mon Sep 17 00:00:00 2001 From: Jack Palmer Date: Fri, 3 May 2024 14:24:23 +0100 Subject: [PATCH 075/136] fix: Typo in copyright Signed-off-by: Jack Palmer --- plugins/auth-backend-module-github-provider/config.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/auth-backend-module-github-provider/config.d.ts b/plugins/auth-backend-module-github-provider/config.d.ts index c8af7eb5db..e79711310d 100644 --- a/plugins/auth-backend-module-github-provider/config.d.ts +++ b/plugins/auth-backend-module-github-provider/config.d.ts @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * Copyright 2024 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. From 4d15444275f26bedf4037bad5c93f73c7aa48cd5 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Fri, 3 May 2024 16:47:25 +0200 Subject: [PATCH 076/136] cli: fix repo fix workspace path on windows Signed-off-by: Vincenzo Scamporlino --- packages/cli/src/commands/repo/fix.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/cli/src/commands/repo/fix.ts b/packages/cli/src/commands/repo/fix.ts index b975203a73..049f5a8416 100644 --- a/packages/cli/src/commands/repo/fix.ts +++ b/packages/cli/src/commands/repo/fix.ts @@ -22,11 +22,7 @@ import { } from '@backstage/cli-node'; import { OptionValues } from 'commander'; import fs from 'fs-extra'; -import { - resolve as resolvePath, - join as joinPath, - relative as relativePath, -} from 'path'; +import { resolve as resolvePath, posix, relative as relativePath } from 'path'; import { paths } from '../../lib/paths'; /** @@ -205,7 +201,7 @@ export function createRepositoryFieldFixer() { const rootDir = rootRepoField.directory || ''; return (pkg: FixablePackage) => { - const expectedPath = joinPath( + const expectedPath = posix.join( rootDir, relativePath(paths.targetRoot, pkg.dir), ); From c52052bdceda72743e2d0305d1f6aff3c2d6728c Mon Sep 17 00:00:00 2001 From: Jack Palmer Date: Fri, 3 May 2024 15:49:28 +0100 Subject: [PATCH 077/136] fox: Add config.d.ts for aws-alb and rename iss to issuer Signed-off-by: Jack Palmer --- .../config.d.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 plugins/auth-backend-module-aws-alb-provider/config.d.ts diff --git a/plugins/auth-backend-module-aws-alb-provider/config.d.ts b/plugins/auth-backend-module-aws-alb-provider/config.d.ts new file mode 100644 index 0000000000..1978e5a4df --- /dev/null +++ b/plugins/auth-backend-module-aws-alb-provider/config.d.ts @@ -0,0 +1,27 @@ +/* + * Copyright 2024 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 interface Config { + auth?: { + providers?: { + /** @visibility frontend */ + awsalb?: { + issuer?: string; + region: string; + }; + }; + }; +} From 9f974a05da653abd5a24ea43f7f496e43291066b Mon Sep 17 00:00:00 2001 From: Jack Palmer Date: Fri, 3 May 2024 15:49:53 +0100 Subject: [PATCH 078/136] fix: Tidy auth-backend config.d.ts Signed-off-by: Jack Palmer --- plugins/auth-backend/config.d.ts | 42 -------------------------------- 1 file changed, 42 deletions(-) diff --git a/plugins/auth-backend/config.d.ts b/plugins/auth-backend/config.d.ts index f0ceaa4224..a7ea18ed1d 100644 --- a/plugins/auth-backend/config.d.ts +++ b/plugins/auth-backend/config.d.ts @@ -89,29 +89,6 @@ export interface Config { * @additionalProperties true */ providers?: { - /** @visibility frontend */ - google?: { - [authEnv: string]: { - clientId: string; - /** - * @visibility secret - */ - clientSecret: string; - callbackUrl?: string; - }; - }; - /** @visibility frontend */ - github?: { - [authEnv: string]: { - clientId: string; - /** - * @visibility secret - */ - clientSecret: string; - callbackUrl?: string; - enterpriseInstanceUrl?: string; - }; - }; /** @visibility frontend */ saml?: { entryPoint: string; @@ -137,20 +114,6 @@ export interface Config { acceptedClockSkewMs?: number; }; /** @visibility frontend */ - oauth2?: { - [authEnv: string]: { - clientId: string; - /** - * @visibility secret - */ - clientSecret: string; - authorizationUrl: string; - tokenUrl: string; - scope?: string; - disableRefresh?: boolean; - }; - }; - /** @visibility frontend */ auth0?: { [authEnv: string]: { clientId: string; @@ -177,11 +140,6 @@ export interface Config { callbackUrl?: string; }; }; - /** @visibility frontend */ - awsalb?: { - iss?: string; - region: string; - }; /** * The backstage token expiration. */ From ed4cd84b10ae123882b0cf549ea9f541ae7d843d Mon Sep 17 00:00:00 2001 From: Jack Palmer Date: Fri, 3 May 2024 15:51:05 +0100 Subject: [PATCH 079/136] chore: Update changelog Signed-off-by: Jack Palmer --- .changeset/blue-balloons-draw.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.changeset/blue-balloons-draw.md b/.changeset/blue-balloons-draw.md index 8208af5105..d17760a92b 100644 --- a/.changeset/blue-balloons-draw.md +++ b/.changeset/blue-balloons-draw.md @@ -3,3 +3,5 @@ --- fix: Add missing config.d.ts for auth-backend-module-github-provider +fix: Add missing config.d.ts for auth-backend-module-aws-alb-provider +fix: Remove duplicate provider config from auth-backend From cc3c51833bf48731751d435b21a341964deb2ad4 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Fri, 3 May 2024 16:54:18 +0200 Subject: [PATCH 080/136] cli: repo fix changeset Signed-off-by: Vincenzo Scamporlino --- .changeset/slimy-kids-behave.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/slimy-kids-behave.md diff --git a/.changeset/slimy-kids-behave.md b/.changeset/slimy-kids-behave.md new file mode 100644 index 0000000000..5e635878ff --- /dev/null +++ b/.changeset/slimy-kids-behave.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Fixed an issue causing the `repo fix` command to set an incorrect `workspace` property using Windows From 4a0577e0ea14c7b490e7ef0d0a459a8b375e292b Mon Sep 17 00:00:00 2001 From: Jack Palmer Date: Fri, 3 May 2024 15:54:41 +0100 Subject: [PATCH 081/136] chore: Fix changelog Signed-off-by: Jack Palmer --- .changeset/blue-balloons-draw.md | 7 ------- .changeset/little-rockets-live.md | 7 +++++++ 2 files changed, 7 insertions(+), 7 deletions(-) delete mode 100644 .changeset/blue-balloons-draw.md create mode 100644 .changeset/little-rockets-live.md diff --git a/.changeset/blue-balloons-draw.md b/.changeset/blue-balloons-draw.md deleted file mode 100644 index d17760a92b..0000000000 --- a/.changeset/blue-balloons-draw.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-auth-backend-module-github-provider': patch ---- - -fix: Add missing config.d.ts for auth-backend-module-github-provider -fix: Add missing config.d.ts for auth-backend-module-aws-alb-provider -fix: Remove duplicate provider config from auth-backend diff --git a/.changeset/little-rockets-live.md b/.changeset/little-rockets-live.md new file mode 100644 index 0000000000..767fda917e --- /dev/null +++ b/.changeset/little-rockets-live.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-auth-backend-module-aws-alb-provider': patch +'@backstage/plugin-auth-backend-module-github-provider': patch +'@backstage/plugin-auth-backend': patch +--- + +fix: Move config declarations to appropriate auth backend modules From a8ea3c5918f8b7c5e54cad5f11aaadf11c856079 Mon Sep 17 00:00:00 2001 From: Jeeva Ramanathan Date: Fri, 3 May 2024 20:34:59 +0530 Subject: [PATCH 082/136] Check pipeline Signed-off-by: Jeeva Ramanathan From 073b2ebf638851d28dc8f1434d0b36f94eebfaf6 Mon Sep 17 00:00:00 2001 From: Beth Griggs Date: Fri, 3 May 2024 15:21:32 +0100 Subject: [PATCH 083/136] chore(test): increase test coverage of WinstonLogger Signed-off-by: Beth Griggs --- .../src/logging/WinstonLogger.test.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/packages/backend-app-api/src/logging/WinstonLogger.test.ts b/packages/backend-app-api/src/logging/WinstonLogger.test.ts index c7173b1cbe..bec6a9fc0f 100644 --- a/packages/backend-app-api/src/logging/WinstonLogger.test.ts +++ b/packages/backend-app-api/src/logging/WinstonLogger.test.ts @@ -22,6 +22,17 @@ function msg(info: TransformableInfo): TransformableInfo { } describe('WinstonLogger', () => { + it('creates a winston logger instance with default options', () => { + const logger = WinstonLogger.create({}); + expect(logger).toBeInstanceOf(WinstonLogger); + }); + + it('creates a child logger', () => { + const logger = WinstonLogger.create({}); + const childLogger = logger.child({ plugin: 'test-plugin' }); + expect(childLogger).toBeInstanceOf(WinstonLogger); + }); + it('redacter should redact and escape regex', () => { const redacter = WinstonLogger.redacter(); const log = { @@ -47,4 +58,24 @@ describe('WinstonLogger', () => { }), ); }); + + it('redacter should redact nested object', () => { + const redacter = WinstonLogger.redacter(); + const log = { + level: 'error', + message: { + nested: 'hello (world) from nested object', + }, + }; + + redacter.add(['hello']); + expect(redacter.format.transform(msg(log))).toEqual( + msg({ + ...log, + message: { + nested: '[REDACTED] (world) from nested', + }, + }), + ); + }); }); From 0cda20fa31a4a92ad69a3a3e87d93d4ee64bb0df Mon Sep 17 00:00:00 2001 From: Bethany Griggs Date: Fri, 3 May 2024 18:08:37 +0100 Subject: [PATCH 084/136] fixup! typo Signed-off-by: Bethany Griggs --- packages/backend-app-api/src/logging/WinstonLogger.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend-app-api/src/logging/WinstonLogger.test.ts b/packages/backend-app-api/src/logging/WinstonLogger.test.ts index bec6a9fc0f..d025719d9a 100644 --- a/packages/backend-app-api/src/logging/WinstonLogger.test.ts +++ b/packages/backend-app-api/src/logging/WinstonLogger.test.ts @@ -73,7 +73,7 @@ describe('WinstonLogger', () => { msg({ ...log, message: { - nested: '[REDACTED] (world) from nested', + nested: '[REDACTED] (world) from nested object', }, }), ); From a1f3cf28646d84e1ba24f31292d55e6ac11e7384 Mon Sep 17 00:00:00 2001 From: Stephon Parker Date: Sat, 4 May 2024 10:12:37 -0400 Subject: [PATCH 085/136] updating the devtools plugin backend readme to add an unlisted property that will cause the build to fail Signed-off-by: Stephon Parker --- plugins/devtools-backend/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/devtools-backend/README.md b/plugins/devtools-backend/README.md index 4439c8cd9f..bf0eb64a98 100644 --- a/plugins/devtools-backend/README.md +++ b/plugins/devtools-backend/README.md @@ -28,6 +28,7 @@ Here's how to get the DevTools Backend up and running: logger: env.logger, config: env.config, permissions: env.permissions, + discovery: env.discovery, }); } ``` From b741e21fa704ff78675641ebc506da6717164fb1 Mon Sep 17 00:00:00 2001 From: Tharun Paul <55498156+paul-tharun@users.noreply.github.com> Date: Sat, 4 May 2024 23:08:10 +0530 Subject: [PATCH 086/136] Fix hyperlink to what-is-a-plugin link Signed-off-by: Tharun Paul <55498156+paul-tharun@users.noreply.github.com> --- docs/faq/product.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/faq/product.md b/docs/faq/product.md index 79465cf53d..edbb1ffb4d 100644 --- a/docs/faq/product.md +++ b/docs/faq/product.md @@ -37,7 +37,7 @@ more, read our blog post, Yes, we've already started releasing open source versions of some of the plugins we use here, and we'll continue to do so. -[Plugins](#what-is-a-plugin-in-backstage) are the building blocks of +[Plugins](technical.md#what-is-a-plugin-in-backstage) are the building blocks of functionality in Backstage. We have over 120 plugins inside Spotify — many of those are specialized for our use, so will remain internal and proprietary to us. But we estimate that about a third of our existing plugins make good open From 036feca470fa144919d6c1ebfc9751d18e9425ce Mon Sep 17 00:00:00 2001 From: Stephon Parker Date: Sat, 4 May 2024 19:01:06 -0400 Subject: [PATCH 087/136] adding changeset to final pr state Signed-off-by: Stephon Parker --- .changeset/grumpy-toes-tap.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/grumpy-toes-tap.md diff --git a/.changeset/grumpy-toes-tap.md b/.changeset/grumpy-toes-tap.md new file mode 100644 index 0000000000..ff3fbbf2df --- /dev/null +++ b/.changeset/grumpy-toes-tap.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-devtools-backend': patch +--- + +Added discovery property to the readme documentation to ensure that it will build when setting it up as new to a Backstage instance From 2866e60532ba78fe0cd2051134c157d2201e898f Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Sun, 5 May 2024 14:29:52 +0200 Subject: [PATCH 088/136] add template editor docs Signed-off-by: Juan Pablo Garcia Ripa --- .../software-templates/context-menu.png | Bin 0 -> 91429 bytes .../template-editor-dry-run.png | Bin 0 -> 105995 bytes .../template-editor-load-dir.png | Bin 0 -> 597409 bytes .../software-templates/writing-templates.md | 36 ++++++++++++++++++ 4 files changed, 36 insertions(+) create mode 100644 docs/assets/software-templates/context-menu.png create mode 100644 docs/assets/software-templates/template-editor-dry-run.png create mode 100644 docs/assets/software-templates/template-editor-load-dir.png diff --git a/docs/assets/software-templates/context-menu.png b/docs/assets/software-templates/context-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4f52cc48c29cbcacb372ef20bace4412930262 GIT binary patch literal 91429 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 literal 0 HcmV?d00001 diff --git a/docs/assets/software-templates/template-editor-dry-run.png b/docs/assets/software-templates/template-editor-dry-run.png new file mode 100644 index 0000000000000000000000000000000000000000..6095fb5cb0bcb2b45277cbdc1a3899e4a4fa42b2 GIT binary patch literal 105995 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­uS@C_AyQtgfQJ!?pIS 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
    3IrPsF}-w2vn|VqnOtFAR~E3CeAp`vmi~QBPRd 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%0Af(^KDXA22toL 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

    -#3vN&C*=JV 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 ZfgBe_mkn Date: Sun, 5 May 2024 16:14:43 -0400 Subject: [PATCH 089/136] docs(nbs): proxying Signed-off-by: aramissennyeydd --- docs/plugins/proxying.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/plugins/proxying.md b/docs/plugins/proxying.md index 40d155e13b..bff38fea40 100644 --- a/docs/plugins/proxying.md +++ b/docs/plugins/proxying.md @@ -15,6 +15,16 @@ can be the best choice for communicating with an API. The plugin is already added to a default Backstage project. +### New Backend + +To add it to a project, add the following line in `packages/backend/src/index.ts`: + +```ts +backend.add(import('@backstage/plugin-proxy-backend/alpha')); +``` + +### Old Backend + In `packages/backend/src/index.ts`: ```ts From 0911fa60c8d6cf2ee521fbfe22a4707c905d9951 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Sun, 5 May 2024 16:37:41 -0400 Subject: [PATCH 090/136] docs(nbs): plugin observability Signed-off-by: aramissennyeydd --- docs/plugins/observability.md | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/docs/plugins/observability.md b/docs/plugins/observability.md index d8778f07f8..bb6f5abbe4 100644 --- a/docs/plugins/observability.md +++ b/docs/plugins/observability.md @@ -37,7 +37,39 @@ An example log line could look as follows: ## Health Checks -The example backend in the Backstage repository +### New Backend + +The new backend is moving towards health checks being plugin-based, as such there is no current plugin for providing a health check route. You can add this yourself easily though, + +```ts +import { + coreServices, + createBackendModule, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; + +const healthCheck = createBackendPlugin({ + pluginId: 'healthcheck', + + register(env) { + env.registerInit({ + deps: { + rootHttpRouter: coreServices.rootHttpRouter, + }, + init: async ({ rootHttpRouter }) => { + // You can adjust the route name and response as you need. + rootHttpRouter.use('/healthcheck', (req, res) => { + res.json({ status: 'ok' }); + }); + }, + }); + }, +}); +``` + +### Old Backend + +The example old backend in the Backstage repository [supplies](https://github.com/backstage/backstage/blob/bc18571b7a742863a770b2a54e785d6bbef7e184/packages/backend/src/index.ts#L99) a very basic health check endpoint on the `/healthcheck` route. You may add such a handler to your backend as well, and supply your own logic to it that fits From b17e7bea59faebfbe685e58e47b8decd3cb09367 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Sun, 5 May 2024 16:52:44 -0400 Subject: [PATCH 091/136] add section about logging Signed-off-by: aramissennyeydd --- docs/plugins/observability.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/plugins/observability.md b/docs/plugins/observability.md index bb6f5abbe4..e13653706f 100644 --- a/docs/plugins/observability.md +++ b/docs/plugins/observability.md @@ -15,6 +15,32 @@ See how to install Datadog Events in your app ## Logging +### New Backend + +The backend supplies a central logging service, [`rootLogger`](../backend-system/core-services/root-logger.md), as well as a plugin based logger, [`logger`](../backend-system/core-services/logger.md) from `coreServices`. To add additional granularity to your logs, you can create children from the plugin based logger, using the `.child()` method and provide is with JSON data. For example, if you wanted to log items for a specific span in your plugin, you could do + +```ts +export function createRouter({ logger }) { + const router = Router(); + + router.post('/task/:taskId/queue', (req, res) => { + const { taskId } = req.params; + const taskLogger = logger.child({ task: taskId }); + taskLogger.log('Queueing this task.'); + }); + + router.get('/task/:taskId/results', (req, res) => { + const { taskId } = req.params; + const taskLogger = logger.child({ task: taskId }); + taskLogger.log('Getting the results of this task.'); + }); +} +``` + +You can also add additional metadata to all logs for your Backstage instance by overriding the `rootLogger` implementation, you can see an example in [the `logger` docs](../backend-system/core-services/logger.md#configuring-the-service). + +### Old Backend + The backend supplies a central [winston](https://github.com/winstonjs/winston) root logger that plugins are expected to use for their logging needs. In the default production setup, it emits structured JSON logs on stdout, with a field From 812dff05b9b99b7665c9d09bd00bb4a86799ca06 Mon Sep 17 00:00:00 2001 From: Mike Ball Date: Sun, 5 May 2024 20:27:35 -0400 Subject: [PATCH 092/136] chore(plugin-template): add missing semicolon This adds a previously-missing semicolon to the `ExampleFetchComponent.test.tsx` file templated out by `backstage-cli new --select plugin`. Signed-off-by: Mike Ball --- .changeset/tasty-moles-jog.md | 5 +++++ .../ExampleFetchComponent/ExampleFetchComponent.test.tsx.hbs | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/tasty-moles-jog.md diff --git a/.changeset/tasty-moles-jog.md b/.changeset/tasty-moles-jog.md new file mode 100644 index 0000000000..f3ac3b63e4 --- /dev/null +++ b/.changeset/tasty-moles-jog.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Add previously-missing semicolon to tsx file templated by `backstage-cli new --select plugin`. diff --git a/packages/cli/templates/default-plugin/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx.hbs b/packages/cli/templates/default-plugin/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx.hbs index 1fe424ab9b..1e746ff39a 100644 --- a/packages/cli/templates/default-plugin/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx.hbs +++ b/packages/cli/templates/default-plugin/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx.hbs @@ -8,7 +8,7 @@ describe('ExampleFetchComponent', () => { // Wait for the table to render const table = await screen.findByRole('table'); - const nationality = screen.getAllByText('GB') + const nationality = screen.getAllByText('GB'); // Assert that the table contains the expected user data expect(table).toBeInTheDocument(); expect(screen.getByAltText('Carolyn')).toBeInTheDocument(); From e96202968cfb06c768df69bee98dfd3f2cd7afbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 6 May 2024 07:13:26 +0200 Subject: [PATCH 093/136] Update .changeset/tasty-moles-jog.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/tasty-moles-jog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/tasty-moles-jog.md b/.changeset/tasty-moles-jog.md index f3ac3b63e4..f28b77337e 100644 --- a/.changeset/tasty-moles-jog.md +++ b/.changeset/tasty-moles-jog.md @@ -2,4 +2,4 @@ '@backstage/cli': patch --- -Add previously-missing semicolon to tsx file templated by `backstage-cli new --select plugin`. +Add previously-missing semicolon in file templated by `backstage-cli new --select plugin`. From fba2993675b5609ee75efc880bf49b1878b03819 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 6 May 2024 11:44:30 +0200 Subject: [PATCH 094/136] Update docs/features/software-templates/writing-templates.md Signed-off-by: Patrik Oldsberg --- docs/features/software-templates/writing-templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index d67f886e12..bf21b91746 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -759,7 +759,7 @@ Allow to load a directory on your local file system that contains a template and ![template editor load dir](../../assets/software-templates/template-editor-load-dir.png) -if you complete the form in the right side and click on `Create` button, the template will be executed in dry-run mode and the result will be shown in the `Dry-run result` drawer that will pop-up at the bottom of the screen. +If you complete the form in the right side and click on `Create` button, the template will be executed in dry-run mode and the result will be shown in the `Dry-run result` drawer that will pop-up at the bottom of the screen. Here we could find all the file system results of the template execution as well as the logs of each action that was executed. From 2f09d4b7cc04893649b69eb48a432e528cbe3f58 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 6 May 2024 11:47:18 +0200 Subject: [PATCH 095/136] Apply suggestions from code review Signed-off-by: Patrik Oldsberg --- packages/core-components/src/layout/Content/Content.stories.tsx | 2 +- .../src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx | 2 +- .../src/layout/HeaderLabel/HeaderLabel.stories.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core-components/src/layout/Content/Content.stories.tsx b/packages/core-components/src/layout/Content/Content.stories.tsx index f8bf055145..fcf8858adc 100644 --- a/packages/core-components/src/layout/Content/Content.stories.tsx +++ b/packages/core-components/src/layout/Content/Content.stories.tsx @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * Copyright 2024 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. diff --git a/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx b/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx index 0d185aeb11..dc50456f7e 100644 --- a/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx +++ b/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * Copyright 2024 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. diff --git a/packages/core-components/src/layout/HeaderLabel/HeaderLabel.stories.tsx b/packages/core-components/src/layout/HeaderLabel/HeaderLabel.stories.tsx index 80baa83a4f..58566a27d2 100644 --- a/packages/core-components/src/layout/HeaderLabel/HeaderLabel.stories.tsx +++ b/packages/core-components/src/layout/HeaderLabel/HeaderLabel.stories.tsx @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * Copyright 2024 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. From e754da5127336da75e6caaf2133ec0aa71ec44fa Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 6 May 2024 11:54:57 +0200 Subject: [PATCH 096/136] e2e-test: remove unused puppeteer dependency Signed-off-by: Patrik Oldsberg --- packages/e2e-test/package.json | 1 - yarn.lock | 259 ++++++--------------------------- 2 files changed, 42 insertions(+), 218 deletions(-) diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index a41c724d5a..e4ddf47d73 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -43,7 +43,6 @@ "@backstage/cli": "workspace:^", "@types/fs-extra": "^11.0.0", "@types/node": "^18.17.8", - "@types/puppeteer": "^7.0.0", "nodemon": "^3.0.1" }, "nodemonConfig": { diff --git a/yarn.lock b/yarn.lock index ea85c43c11..0eb13f4629 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12254,24 +12254,6 @@ __metadata: languageName: node linkType: hard -"@puppeteer/browsers@npm:2.2.1": - version: 2.2.1 - resolution: "@puppeteer/browsers@npm:2.2.1" - dependencies: - debug: 4.3.4 - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.4.0 - semver: 7.6.0 - tar-fs: 3.0.5 - unbzip2-stream: 1.4.3 - yargs: 17.7.2 - bin: - browsers: lib/cjs/main-cli.js - checksum: c2ec8bac9978ae6279d67442a3a81c517db1e172bd4603d1983eb48de12b088d8b565b1817abe21ba6df76be9a68e3fc543d4c7111c964a93f3ac9b14f7c76e5 - languageName: node - linkType: hard - "@radix-ui/primitive@npm:1.0.1": version: 1.0.1 resolution: "@radix-ui/primitive@npm:1.0.1" @@ -16495,15 +16477,6 @@ __metadata: languageName: node linkType: hard -"@types/puppeteer@npm:^7.0.0": - version: 7.0.4 - resolution: "@types/puppeteer@npm:7.0.4" - dependencies: - puppeteer: "*" - checksum: c84a44b054454c13935a9cf0f8983166e238532397af4f321c918d89b43a91f854460e3d0dda122f72c258b444dbcdc04ada950e35adc1938ff3b7831c6fd7a4 - languageName: node - linkType: hard - "@types/qs@npm:*": version: 6.9.6 resolution: "@types/qs@npm:6.9.6" @@ -17081,7 +17054,7 @@ __metadata: languageName: node linkType: hard -"@types/yauzl@npm:^2.10.0, @types/yauzl@npm:^2.9.1": +"@types/yauzl@npm:^2.10.0": version: 2.10.3 resolution: "@types/yauzl@npm:2.10.3" dependencies: @@ -19655,7 +19628,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.2.1, buffer@npm:^5.5.0, buffer@npm:^5.7.1": +"buffer@npm:^5.5.0, buffer@npm:^5.7.1": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -20145,19 +20118,6 @@ __metadata: languageName: node linkType: hard -"chromium-bidi@npm:0.5.17": - version: 0.5.17 - resolution: "chromium-bidi@npm:0.5.17" - dependencies: - mitt: 3.0.1 - urlpattern-polyfill: 10.0.0 - zod: 3.22.4 - peerDependencies: - devtools-protocol: "*" - checksum: 522da996ed5abfb47707583cc24785f9aa05d87bd968dbd520f245cf8972fa3ec102f8d1d72fa07558daa70495d8c6f2bf364d8599eb60b77504e528601d8a30 - languageName: node - linkType: hard - "ci-info@npm:^2.0.0": version: 2.0.0 resolution: "ci-info@npm:2.0.0" @@ -21166,23 +21126,6 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:9.0.0": - version: 9.0.0 - resolution: "cosmiconfig@npm:9.0.0" - dependencies: - env-paths: ^2.2.1 - import-fresh: ^3.3.0 - js-yaml: ^4.1.0 - parse-json: ^5.2.0 - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true - checksum: a30c424b53d442ea0bdd24cb1b3d0d8687c8dda4a17ab6afcdc439f8964438801619cdb66e8e79f63b9caa3e6586b60d8bab9ce203e72df6c5e80179b971fe8f - languageName: node - linkType: hard - "cosmiconfig@npm:^6.0.0": version: 6.0.0 resolution: "cosmiconfig@npm:6.0.0" @@ -22423,13 +22366,6 @@ __metadata: languageName: node linkType: hard -"devtools-protocol@npm:0.0.1262051": - version: 0.0.1262051 - resolution: "devtools-protocol@npm:0.0.1262051" - checksum: beaad00059964a661ab056d5e993492742c612c0370c6f08acd91490181c4d4ecf57d316eedb5a37fb6bb59321901d09ce50762f79ea09a50751d86f601b8f8e - languageName: node - linkType: hard - "dezalgo@npm:^1.0.0, dezalgo@npm:^1.0.4": version: 1.0.4 resolution: "dezalgo@npm:1.0.4" @@ -22839,7 +22775,6 @@ __metadata: "@backstage/errors": "workspace:^" "@types/fs-extra": ^11.0.0 "@types/node": ^18.17.8 - "@types/puppeteer": ^7.0.0 chalk: ^4.0.0 commander: ^12.0.0 cross-fetch: ^4.0.0 @@ -24589,23 +24524,6 @@ __metadata: languageName: node linkType: hard -"extract-zip@npm:2.0.1": - version: 2.0.1 - resolution: "extract-zip@npm:2.0.1" - dependencies: - "@types/yauzl": ^2.9.1 - debug: ^4.1.1 - get-stream: ^5.1.0 - yauzl: ^2.10.0 - dependenciesMeta: - "@types/yauzl": - optional: true - bin: - extract-zip: cli.js - checksum: 8cbda9debdd6d6980819cc69734d874ddd71051c9fe5bde1ef307ebcedfe949ba57b004894b585f758b7c9eeeea0e3d87f2dda89b7d25320459c2c9643ebb635 - languageName: node - linkType: hard - "extsprintf@npm:1.3.0": version: 1.3.0 resolution: "extsprintf@npm:1.3.0" @@ -24838,15 +24756,6 @@ __metadata: languageName: node linkType: hard -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" - dependencies: - pend: ~1.2.0 - checksum: c8585fd5713f4476eb8261150900d2cb7f6ff2d87f8feb306ccc8a1122efd152f1783bdb2b8dc891395744583436bfd8081d8e63ece0ec8687eeefea394d4ff2 - languageName: node - linkType: hard - "fecha@npm:^4.2.0": version: 4.2.0 resolution: "fecha@npm:4.2.0" @@ -26713,7 +26622,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.1": +"http-proxy-agent@npm:^7.0.0": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" dependencies: @@ -26811,7 +26720,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:7.0.4, https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2, https-proxy-agent@npm:^7.0.3": +"https-proxy-agent@npm:7.0.4, https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2": version: 7.0.4 resolution: "https-proxy-agent@npm:7.0.4" dependencies: @@ -31790,13 +31699,6 @@ __metadata: languageName: node linkType: hard -"mitt@npm:3.0.1": - version: 3.0.1 - resolution: "mitt@npm:3.0.1" - checksum: b55a489ac9c2949ab166b7f060601d3b6d893a852515ae9eca4e11df01c013876df777ea109317622b5c1c60e8aae252558e33c8c94e14124db38f64a39614b1 - languageName: node - linkType: hard - "mixme@npm:^0.5.1": version: 0.5.4 resolution: "mixme@npm:0.5.4" @@ -33532,7 +33434,7 @@ __metadata: languageName: node linkType: hard -"pac-proxy-agent@npm:^7.0.0, pac-proxy-agent@npm:^7.0.1": +"pac-proxy-agent@npm:^7.0.0": version: 7.0.1 resolution: "pac-proxy-agent@npm:7.0.1" dependencies: @@ -35175,13 +35077,6 @@ __metadata: languageName: node linkType: hard -"progress@npm:2.0.3": - version: 2.0.3 - resolution: "progress@npm:2.0.3" - checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 - languageName: node - linkType: hard - "prom-client@npm:^15.0.0": version: 15.1.2 resolution: "prom-client@npm:15.1.2" @@ -35369,22 +35264,6 @@ __metadata: languageName: node linkType: hard -"proxy-agent@npm:6.4.0": - version: 6.4.0 - resolution: "proxy-agent@npm:6.4.0" - dependencies: - agent-base: ^7.0.2 - debug: ^4.3.4 - http-proxy-agent: ^7.0.1 - https-proxy-agent: ^7.0.3 - lru-cache: ^7.14.1 - pac-proxy-agent: ^7.0.1 - proxy-from-env: ^1.1.0 - socks-proxy-agent: ^8.0.2 - checksum: 4d3794ad5e07486298902f0a7f250d0f869fa0e92d790767ca3f793a81374ce0ab6c605f8ab8e791c4d754da96656b48d1c24cb7094bfd310a15867e4a0841d7 - languageName: node - linkType: hard - "proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" @@ -35467,33 +35346,6 @@ __metadata: languageName: node linkType: hard -"puppeteer-core@npm:22.6.4": - version: 22.6.4 - resolution: "puppeteer-core@npm:22.6.4" - dependencies: - "@puppeteer/browsers": 2.2.1 - chromium-bidi: 0.5.17 - debug: 4.3.4 - devtools-protocol: 0.0.1262051 - ws: 8.16.0 - checksum: 76d4328e7d2a788a7a2dc3a8b19571f8eda842ff990da2fe773c3e5c01236a03856b67d9a2a6ae976f8fa74ab38813e2c7e7c4b15b9715965b2156e9ca1f9a78 - languageName: node - linkType: hard - -"puppeteer@npm:*": - version: 22.6.4 - resolution: "puppeteer@npm:22.6.4" - dependencies: - "@puppeteer/browsers": 2.2.1 - cosmiconfig: 9.0.0 - devtools-protocol: 0.0.1262051 - puppeteer-core: 22.6.4 - bin: - puppeteer: lib/esm/puppeteer/node/cli.js - checksum: 7dcbda7fc3b999f3ee7808d1c67da41be0aeabd66b0831711a46a897a2681d117f044263e57aeb7d0a096c420bb9f5871c5c2b21c38e40d323fa675e1de322c9 - languageName: node - linkType: hard - "pure-color@npm:^1.2.0": version: 1.3.0 resolution: "pure-color@npm:1.3.0" @@ -37844,7 +37696,16 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.6.0, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.4.0, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:^6.0.0, semver@npm:^6.1.0, semver@npm:^6.2.0, semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 + languageName: node + linkType: hard + +"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.4.0, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": version: 7.6.0 resolution: "semver@npm:7.6.0" dependencies: @@ -37855,15 +37716,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.1.0, semver@npm:^6.2.0, semver@npm:^6.3.0, semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 - languageName: node - linkType: hard - "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -39604,7 +39456,19 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:3.0.5, tar-fs@npm:^3.0.5": +"tar-fs@npm:^2.0.0": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: ^1.1.1 + mkdirp-classic: ^0.5.2 + pump: ^3.0.0 + tar-stream: ^2.1.4 + checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d + languageName: node + linkType: hard + +"tar-fs@npm:^3.0.5": version: 3.0.5 resolution: "tar-fs@npm:3.0.5" dependencies: @@ -39621,18 +39485,6 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:^2.0.0": - version: 2.1.1 - resolution: "tar-fs@npm:2.1.1" - dependencies: - chownr: ^1.1.1 - mkdirp-classic: ^0.5.2 - pump: ^3.0.0 - tar-stream: ^2.1.4 - checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d - languageName: node - linkType: hard - "tar-fs@npm:~2.0.1": version: 2.0.1 resolution: "tar-fs@npm:2.0.1" @@ -39900,7 +39752,7 @@ __metadata: languageName: node linkType: hard -"through@npm:2, through@npm:^2.3.6, through@npm:^2.3.8": +"through@npm:2, through@npm:^2.3.6": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd @@ -40757,16 +40609,6 @@ __metadata: languageName: node linkType: hard -"unbzip2-stream@npm:1.4.3": - version: 1.4.3 - resolution: "unbzip2-stream@npm:1.4.3" - dependencies: - buffer: ^5.2.1 - through: ^2.3.8 - checksum: 0e67c4a91f4fa0fc7b4045f8b914d3498c2fc2e8c39c359977708ec85ac6d6029840e97f508675fdbdf21fcb8d276ca502043406f3682b70f075e69aae626d1d - languageName: node - linkType: hard - "undefsafe@npm:^2.0.5": version: 2.0.5 resolution: "undefsafe@npm:2.0.5" @@ -41164,13 +41006,6 @@ __metadata: languageName: node linkType: hard -"urlpattern-polyfill@npm:10.0.0": - version: 10.0.0 - resolution: "urlpattern-polyfill@npm:10.0.0" - checksum: 61d890f151ea4ecf34a3dcab32c65ad1f3cda857c9d154af198260c6e5b2ad96d024593409baaa6d4428dd1ab206c14799bf37fe011117ac93a6a44913ac5aa4 - languageName: node - linkType: hard - "urlpattern-polyfill@npm:^9.0.0": version: 9.0.0 resolution: "urlpattern-polyfill@npm:9.0.0" @@ -42289,7 +42124,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:*, ws@npm:8.16.0, ws@npm:^8.11.0, ws@npm:^8.12.0, ws@npm:^8.13.0, ws@npm:^8.14.2, ws@npm:^8.16.0, ws@npm:^8.8.0": +"ws@npm:*, ws@npm:^8.11.0, ws@npm:^8.12.0, ws@npm:^8.13.0, ws@npm:^8.14.2, ws@npm:^8.16.0, ws@npm:^8.8.0": version: 8.16.0 resolution: "ws@npm:8.16.0" peerDependencies: @@ -42580,21 +42415,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:17.7.2, yargs@npm:^17.1.1, yargs@npm:^17.3.1, yargs@npm:^17.7.1, yargs@npm:^17.7.2": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: ^8.0.1 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.3 - y18n: ^5.0.5 - yargs-parser: ^21.1.1 - checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a - languageName: node - linkType: hard - "yargs@npm:^15.1.0": version: 15.4.1 resolution: "yargs@npm:15.4.1" @@ -42629,13 +42449,18 @@ __metadata: languageName: node linkType: hard -"yauzl@npm:^2.10.0": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" +"yargs@npm:^17.1.1, yargs@npm:^17.3.1, yargs@npm:^17.7.1, yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" dependencies: - buffer-crc32: ~0.2.3 - fd-slicer: ~1.1.0 - checksum: 7f21fe0bbad6e2cb130044a5d1d0d5a0e5bf3d8d4f8c4e6ee12163ce798fee3de7388d22a7a0907f563ac5f9d40f8699a223d3d5c1718da90b0156da6904022b + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a languageName: node linkType: hard @@ -42810,7 +42635,7 @@ __metadata: languageName: node linkType: hard -"zod@npm:3.22.4, zod@npm:^3.22.4": +"zod@npm:^3.22.4": version: 3.22.4 resolution: "zod@npm:3.22.4" checksum: 80bfd7f8039b24fddeb0718a2ec7c02aa9856e4838d6aa4864335a047b6b37a3273b191ef335bf0b2002e5c514ef261ffcda5a589fb084a48c336ffc4cdbab7f From 190a4036f98aba2d131963904d310e81c4e42e4a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 10:36:37 +0000 Subject: [PATCH 097/136] fix(deps): update dependency zod to v3.23.6 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0eb13f4629..7f949ceb5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42636,9 +42636,9 @@ __metadata: linkType: hard "zod@npm:^3.22.4": - version: 3.22.4 - resolution: "zod@npm:3.22.4" - checksum: 80bfd7f8039b24fddeb0718a2ec7c02aa9856e4838d6aa4864335a047b6b37a3273b191ef335bf0b2002e5c514ef261ffcda5a589fb084a48c336ffc4cdbab7f + version: 3.23.6 + resolution: "zod@npm:3.23.6" + checksum: f534119e2a54e86bf77e5c6ff630ef4ec50b87dd9d9faf66dc7a663a489d37130b716ebd836cdd9d7fc6e124a1accdc0d53f388243a236c10e632dcc945eaa27 languageName: node linkType: hard From 5378a641debb190fbefc8bf744b0c4589e0fdbe4 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 6 May 2024 14:26:03 +0200 Subject: [PATCH 098/136] chore: support overwriting of action Signed-off-by: blam --- .github/workflows/api-breaking-changes.yml | 2 ++ .github/workflows/pr-review-comment-trigger.yaml | 1 + .github/workflows/scorecard.yml | 1 + .github/workflows/uffizzi-build.yml | 3 +++ 4 files changed, 7 insertions(+) diff --git a/.github/workflows/api-breaking-changes.yml b/.github/workflows/api-breaking-changes.yml index 7834fd195f..6db9720b49 100644 --- a/.github/workflows/api-breaking-changes.yml +++ b/.github/workflows/api-breaking-changes.yml @@ -47,6 +47,7 @@ jobs: name: preview-spec path: comment.md retention-days: 2 + overwrite: true - name: Upload PR Event as Artifact uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 @@ -54,3 +55,4 @@ jobs: name: preview-spec path: ${{ github.event_path }} retention-days: 2 + overwrite: true diff --git a/.github/workflows/pr-review-comment-trigger.yaml b/.github/workflows/pr-review-comment-trigger.yaml index 4d7d511cc8..5e7d71cbf4 100644 --- a/.github/workflows/pr-review-comment-trigger.yaml +++ b/.github/workflows/pr-review-comment-trigger.yaml @@ -34,3 +34,4 @@ jobs: with: name: pr_number-${{ github.event.pull_request.number }} path: pr/ + overwrite: true diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 355ecf6727..bd47f315de 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -63,6 +63,7 @@ jobs: name: SARIF file path: results.sarif retention-days: 5 + overwrite: true # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' diff --git a/.github/workflows/uffizzi-build.yml b/.github/workflows/uffizzi-build.yml index 7ccf39489e..0fb5ea5b8a 100644 --- a/.github/workflows/uffizzi-build.yml +++ b/.github/workflows/uffizzi-build.yml @@ -103,12 +103,14 @@ jobs: name: preview-spec path: ./.github/uffizzi/k8s/manifests/manifests.rendered.yml retention-days: 2 + overwrite: true - name: Upload PR Event as Artifact uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: preview-spec path: ${{ github.event_path }} retention-days: 2 + overwrite: true delete-preview: name: Call for Preview Deletion @@ -127,3 +129,4 @@ jobs: name: preview-spec path: ${{ github.event_path }} retention-days: 2 + overwrite: true From 9a7355f7600fdb25686b2fee7741fda2188dcbd5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 12:48:03 +0000 Subject: [PATCH 099/136] chore(deps): update dependency @types/lodash to v4.17.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f90b972ae7..a9d18ff80e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16116,9 +16116,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.151": - version: 4.17.0 - resolution: "@types/lodash@npm:4.17.0" - checksum: 3f98c0b67a93994cbc3403d4fa9dbaf52b0b6bb7f07a764d73875c2dcd5ef91222621bd5bcf8eee7b417a74d175c2f7191b9f595f8603956fd06f0674c0cba93 + version: 4.17.1 + resolution: "@types/lodash@npm:4.17.1" + checksum: 01984d5b44c09ef45258f8ac6d0cf926900624064722d51a020ba179e5d4a293da0068fb278d87dc695586afe7ebd3362ec57f5c0e7c4f6c1fab9d04a80e77f5 languageName: node linkType: hard From 56cfa19a2194b24952db8c861d38d7845c606527 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Tue, 23 Apr 2024 14:51:16 +0530 Subject: [PATCH 100/136] Updated README Document of app custom theme Signed-off-by: AmbrishRamachandiran --- docs/getting-started/app-custom-theme.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/getting-started/app-custom-theme.md b/docs/getting-started/app-custom-theme.md index 8aadeaf19a..3fb0365ad0 100644 --- a/docs/getting-started/app-custom-theme.md +++ b/docs/getting-started/app-custom-theme.md @@ -28,7 +28,11 @@ export const myTheme = createUnifiedTheme({ }); ``` -> Note: we recommend creating a `theme` folder in `packages/app/src` to place your theme file to keep things nicely organized. +:::note Note + +we recommend creating a `theme` folder in `packages/app/src` to place your theme file to keep things nicely organized. + +::: You can also create a theme from scratch that matches the `BackstageTheme` type exported by [`@backstage/theme`](https://www.npmjs.com/package/@backstage/theme). See the [Material UI docs on theming](https://material-ui.com/customization/theming/) for more information about how that can be done. @@ -504,7 +508,11 @@ You can add more icons, if the [default icons](https://github.com/backstage/back You might want to use this method if you have an icon you want to use in several locations. -Note: If the icon is not available as one of the default icons or one you've added then it will fall back to Material UI's `LanguageIcon` +:::note Note + +If the icon is not available as one of the default icons or one you've added then it will fall back to Material UI's `LanguageIcon` + +::: ## Custom Sidebar From f4fcce8cdc7ac6e95b2c0b8c6a52d935a3ddfe14 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 1 May 2024 15:06:45 +0200 Subject: [PATCH 101/136] backend -> backend-legacy, backend-next -> backend Signed-off-by: Patrik Oldsberg --- docs/auth/vmware-cloud/provider.md | 2 +- docs/backend-system/index.md | 2 +- docs/conf/reading.md | 2 +- docs/features/kubernetes/proxy.md | 2 - docs/features/search/how-to-guides.md | 2 +- .../software-catalog/external-integrations.md | 4 +- docs/plugins/new-backend-system.md | 2 +- package.json | 6 +- packages/app-next/README.md | 2 +- .../backend-dynamic-feature-service/README.md | 2 +- .../.eslintrc.js | 0 .../{backend-next => backend-legacy}/.snyk | 0 packages/backend-legacy/CHANGELOG.md | 6887 +++++++++++++++++ packages/backend-legacy/README.md | 61 + .../catalog-info.yaml | 4 +- packages/backend-legacy/knip-report.md | 27 + .../package.json | 74 +- .../prometheus.yml | 0 .../src/index.test.ts | 0 packages/backend-legacy/src/index.ts | 184 + .../src/metrics.ts | 0 .../plugins/DemoEventBasedEntityProvider.ts | 0 .../src/plugins/app.ts | 0 .../src/plugins/auth.ts | 0 .../src/plugins/catalog.ts | 0 .../src/plugins/devtools.ts | 0 .../src/plugins/events.ts | 0 .../src/plugins/healthcheck.ts | 0 .../src/plugins/kubernetes.ts | 0 .../src/plugins/permission.ts | 0 .../src/plugins/proxy.ts | 0 .../src/plugins/scaffolder.ts | 0 .../src/plugins/search.ts | 0 .../src/plugins/signals.ts | 0 .../src/plugins/techdocs.ts | 0 .../{backend => backend-legacy}/src/types.ts | 0 packages/backend-next/CHANGELOG.md | 2400 ------ packages/backend-next/README.md | 5 - packages/backend-next/knip-report.md | 12 - packages/backend-next/src/index.ts | 51 - packages/backend/CHANGELOG.md | 5391 ++----------- packages/backend/README.md | 16 +- packages/backend/knip-report.md | 31 +- packages/backend/package.json | 57 +- .../src/authModuleGithubProvider.ts | 0 packages/backend/src/index.ts | 195 +- plugins/auth-backend/api-report.md | 4 +- .../README.md | 18 +- .../search-backend-module-catalog/README.md | 4 +- yarn.lock | 89 +- 50 files changed, 7791 insertions(+), 7745 deletions(-) rename packages/{backend-next => backend-legacy}/.eslintrc.js (100%) rename packages/{backend-next => backend-legacy}/.snyk (100%) create mode 100644 packages/backend-legacy/CHANGELOG.md create mode 100644 packages/backend-legacy/README.md rename packages/{backend-next => backend-legacy}/catalog-info.yaml (68%) create mode 100644 packages/backend-legacy/knip-report.md rename packages/{backend-next => backend-legacy}/package.json (52%) rename packages/{backend => backend-legacy}/prometheus.yml (100%) rename packages/{backend => backend-legacy}/src/index.test.ts (100%) create mode 100644 packages/backend-legacy/src/index.ts rename packages/{backend => backend-legacy}/src/metrics.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/DemoEventBasedEntityProvider.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/app.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/auth.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/catalog.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/devtools.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/events.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/healthcheck.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/kubernetes.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/permission.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/proxy.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/scaffolder.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/search.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/signals.ts (100%) rename packages/{backend => backend-legacy}/src/plugins/techdocs.ts (100%) rename packages/{backend => backend-legacy}/src/types.ts (100%) delete mode 100644 packages/backend-next/CHANGELOG.md delete mode 100644 packages/backend-next/README.md delete mode 100644 packages/backend-next/knip-report.md delete mode 100644 packages/backend-next/src/index.ts rename packages/{backend-next => backend}/src/authModuleGithubProvider.ts (100%) diff --git a/docs/auth/vmware-cloud/provider.md b/docs/auth/vmware-cloud/provider.md index 8536eaea7e..0ff928ab7f 100644 --- a/docs/auth/vmware-cloud/provider.md +++ b/docs/auth/vmware-cloud/provider.md @@ -43,7 +43,7 @@ Cloud Console and within a Backstage app required to enable this capability. Apps using the [new backend system](../../backend-system/index.md), can enable the VMware Cloud provider with a small modification like: -```ts title="packages/backend-next/src/index.ts" +```ts title="packages/backend/src/index.ts" import { createBackend } from '@backstage/backend-defaults'; const backend = createBackend(); diff --git a/docs/backend-system/index.md b/docs/backend-system/index.md index 22ea4c6c59..b8cf5048be 100644 --- a/docs/backend-system/index.md +++ b/docs/backend-system/index.md @@ -10,4 +10,4 @@ description: The Backend System The new backend system is released and ready for production use, and many plugins and modules have already been migrated. We recommend all plugins and deployments to migrate to the new system. -You can find an example backend setup in [the `backend-next` package](https://github.com/backstage/backstage/tree/master/packages/backend-next). +You can find an example backend setup in [the `backend` package](https://github.com/backstage/backstage/tree/master/packages/backend). diff --git a/docs/conf/reading.md b/docs/conf/reading.md index 5f7218479a..f7d1edae86 100644 --- a/docs/conf/reading.md +++ b/docs/conf/reading.md @@ -145,7 +145,7 @@ from `@backstage/core-plugin-api`. In the old backend system plugins, the configuration is passed in via options from the main backend package. See for example -[packages/backend/src/plugins/auth.ts](https://github.com/backstage/backstage/blob/244eef851f5aa19f91c7c9b5c12d5df95cf482ca/packages/backend/src/plugins/auth.ts#L23). +[packages/backend-legacy/src/plugins/auth.ts](https://github.com/backstage/backstage/blob/244eef851f5aa19f91c7c9b5c12d5df95cf482ca/packages/backend/src/plugins/auth.ts#L23). ### New Backend System diff --git a/docs/features/kubernetes/proxy.md b/docs/features/kubernetes/proxy.md index 5811ff8ec4..4ccc2d22b1 100644 --- a/docs/features/kubernetes/proxy.md +++ b/docs/features/kubernetes/proxy.md @@ -64,8 +64,6 @@ This feature assumes your backstage instance has enabled the [permissions framew A sample policy like: -[packages/backend/src/plugins/permissions.ts](https://github.com/backstage/backstage/blob/master/packages/backend/src/plugins/permission.ts) - ```typescript import { BackstageIdentityResponse } from '@backstage/plugin-auth-node'; import { diff --git a/docs/features/search/how-to-guides.md b/docs/features/search/how-to-guides.md index e49bdb4fa5..6564fd0a44 100644 --- a/docs/features/search/how-to-guides.md +++ b/docs/features/search/how-to-guides.md @@ -393,7 +393,7 @@ There are other more specific search results layout components that also accept Recently, the Backstage maintainers [announced the new Backend System](https://backstage.io/blog/2023/02/15/backend-system-alpha). The search plugins are now migrated to support the new backend system. In this guide you will learn how to update your backend set up. -In "packages/backend-next/index.ts", install the search plugin [1], the search engine [2], and the search collators/decorators modules [3]: +In "packages/backend/index.ts", install the search plugin [1], the search engine [2], and the search collators/decorators modules [3]: ```ts import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; diff --git a/docs/features/software-catalog/external-integrations.md b/docs/features/software-catalog/external-integrations.md index a1dcbabb99..6eaee2f80d 100644 --- a/docs/features/software-catalog/external-integrations.md +++ b/docs/features/software-catalog/external-integrations.md @@ -55,7 +55,7 @@ Some defining traits of entity providers: The recommended way of instantiating the catalog backend classes is to use the `CatalogBuilder`, as illustrated in the -[example backend here](https://github.com/backstage/backstage/blob/master/packages/backend/src/plugins/catalog.ts). +[example backend here](https://github.com/backstage/backstage/blob/master/packages/backend-legacy/src/plugins/catalog.ts). We will create a new [`EntityProvider`](https://github.com/backstage/backstage/blob/master/plugins/catalog-node/src/api/provider.ts) subclass that can be added to this catalog builder. @@ -531,7 +531,7 @@ does so! The recommended way of instantiating the catalog backend classes is to use the `CatalogBuilder`, as illustrated in the -[example backend here](https://github.com/backstage/backstage/blob/master/packages/backend/src/plugins/catalog.ts). +[example backend here](https://github.com/backstage/backstage/blob/master/packages/backend-legacy/src/plugins/catalog.ts). We will create a new [`CatalogProcessor`](https://github.com/backstage/backstage/blob/master/plugins/catalog-node/src/api/processor.ts) subclass that can be added to this catalog builder. diff --git a/docs/plugins/new-backend-system.md b/docs/plugins/new-backend-system.md index 08ed7e73c7..e8a2ca1b19 100644 --- a/docs/plugins/new-backend-system.md +++ b/docs/plugins/new-backend-system.md @@ -8,7 +8,7 @@ description: Details of the new backend system The new backend system is released and ready for production use, and many plugins and modules have already been migrated. We recommend all plugins and deployments to migrate to the new system. -You can find an example backend setup in [the backend-next package](https://github.com/backstage/backstage/tree/master/packages/backend-next). +You can find an example backend setup in [the backend package](https://github.com/backstage/backstage/tree/master/packages/backend). ## Overview diff --git a/package.json b/package.json index 768448402f..45bc0a2973 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "clean": "backstage-cli repo clean", "create-plugin": "echo \"use 'yarn new' instead\"", "dev": "yarn workspaces foreach -A --include example-backend --include example-app --parallel -v -i run start", - "dev:next": "yarn workspaces foreach -A --include example-backend-next --include example-app-next --parallel -v -i run start", + "dev:next": "yarn workspaces foreach -A --include example-backend --include example-app-next --parallel -v -i run start", "docker-build": "yarn tsc && yarn workspace example-backend build && yarn workspace example-backend build-image", "fix": "backstage-cli repo fix", "postinstall": "husky || true", @@ -41,8 +41,8 @@ "snyk:test:package": "yarn snyk:test --include", "start": "yarn workspace example-app start", "start-backend": "yarn workspace example-backend start", - "start-backend:next": "yarn workspace example-backend-next start", - "start:lighthouse": "yarn workspaces foreach -A --include example-backend-next --include example-app --parallel -v -i run start", + "start-backend:legacy": "yarn workspace example-backend-legacy start", + "start:lighthouse": "yarn workspaces foreach -A --include example-backend --include example-app --parallel -v -i run start", "start:microsite": "cd microsite/ && yarn start", "start:next": "yarn workspace example-app-next start", "storybook": "yarn --cwd storybook && yarn --cwd storybook start", diff --git a/packages/app-next/README.md b/packages/app-next/README.md index 360e5d5545..203aaa9f79 100644 --- a/packages/app-next/README.md +++ b/packages/app-next/README.md @@ -4,4 +4,4 @@ This package is an example of a Backstage application using the [new frontend](. To play with it, open a terminal and run the command: `yarn start` -**NOTE:** Don't forget to open a second terminal and to launch the backend or [backend-next](../../docs/backend-system/index.md) there, using `yarn start`! The frontend requires a backend to connect to. +**NOTE:** Don't forget to open a second terminal and to launch the backend there, using `yarn start`! The frontend requires a backend to connect to. diff --git a/packages/backend-dynamic-feature-service/README.md b/packages/backend-dynamic-feature-service/README.md index 211148ee10..a2f29b3d8f 100644 --- a/packages/backend-dynamic-feature-service/README.md +++ b/packages/backend-dynamic-feature-service/README.md @@ -10,7 +10,7 @@ In order to test the dynamic backend plugins feature provided by this package, e The dynamic plugin manager is a service that scans a configured root directory (`dynamicPlugins.rootDirectory` in the app config) for dynamic plugin packages, and loads them dynamically. -In the `backend-next` application, it can be enabled by adding the `backend-dynamic-feature-service` as a dependency in the `package.json` and the following lines in the `src/index.ts` file: +In the `backend` application, it can be enabled by adding the `backend-dynamic-feature-service` as a dependency in the `package.json` and the following lines in the `src/index.ts` file: ```ts const backend = createBackend(); diff --git a/packages/backend-next/.eslintrc.js b/packages/backend-legacy/.eslintrc.js similarity index 100% rename from packages/backend-next/.eslintrc.js rename to packages/backend-legacy/.eslintrc.js diff --git a/packages/backend-next/.snyk b/packages/backend-legacy/.snyk similarity index 100% rename from packages/backend-next/.snyk rename to packages/backend-legacy/.snyk diff --git a/packages/backend-legacy/CHANGELOG.md b/packages/backend-legacy/CHANGELOG.md new file mode 100644 index 0000000000..f6d199c6df --- /dev/null +++ b/packages/backend-legacy/CHANGELOG.md @@ -0,0 +1,6887 @@ +# example-backend-legacy + +## 0.2.98-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.1 + - @backstage/backend-common@0.22.0-next.1 + - @backstage/plugin-catalog-backend@1.22.0-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.1 + - @backstage/plugin-scaffolder-backend@1.22.5-next.1 + - example-app@0.2.97-next.1 + - @backstage/plugin-search-backend@1.5.8-next.1 + - @backstage/plugin-app-backend@0.3.66-next.1 + - @backstage/plugin-kubernetes-backend@0.17.1-next.1 + - @backstage/backend-tasks@0.5.23-next.1 + - @backstage/plugin-auth-backend@0.22.5-next.1 + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/plugin-devtools-backend@0.3.4-next.1 + - @backstage/plugin-events-backend@0.3.5-next.1 + - @backstage/plugin-events-node@0.3.4-next.1 + - @backstage/plugin-permission-backend@0.5.42-next.1 + - @backstage/plugin-permission-node@0.7.29-next.1 + - @backstage/plugin-proxy-backend@0.4.16-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.19-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.4-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.35-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.24-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.4.1-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.24-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.27-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.1 + - @backstage/plugin-search-backend-node@1.2.22-next.1 + - @backstage/plugin-signals-backend@0.1.4-next.1 + - @backstage/plugin-signals-node@0.1.4-next.1 + - @backstage/plugin-techdocs-backend@1.10.5-next.1 + - @backstage/plugin-catalog-node@1.11.2-next.1 + +## 0.2.98-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.22.0-next.0 + - @backstage/plugin-scaffolder-backend@1.22.5-next.0 + - @backstage/catalog-model@1.5.0-next.0 + - @backstage/plugin-search-backend-node@1.2.22-next.0 + - @backstage/plugin-search-backend@1.5.8-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.4-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.23-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.23-next.0 + - @backstage/plugin-auth-backend@0.22.5-next.0 + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-common@0.21.8-next.0 + - example-app@0.2.97-next.0 + - @backstage/plugin-app-backend@0.3.66-next.0 + - @backstage/plugin-kubernetes-backend@0.17.1-next.0 + - @backstage/catalog-client@1.6.5-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.0 + - @backstage/plugin-catalog-node@1.11.2-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.0 + - @backstage/plugin-techdocs-backend@1.10.5-next.0 + - @backstage/backend-tasks@0.5.23-next.0 + - @backstage/config@1.2.0 + - @backstage/integration@1.10.0 + - @backstage/plugin-devtools-backend@0.3.4-next.0 + - @backstage/plugin-events-backend@0.3.5-next.0 + - @backstage/plugin-events-node@0.3.4-next.0 + - @backstage/plugin-permission-backend@0.5.42-next.0 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-permission-node@0.7.29-next.0 + - @backstage/plugin-proxy-backend@0.4.16-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.19-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.35-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.4.1-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.27-next.0 + - @backstage/plugin-signals-backend@0.1.4-next.0 + - @backstage/plugin-signals-node@0.1.4-next.0 + +## 0.2.97 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-pg@0.5.26 + - @backstage/plugin-badges-backend@0.4.0 + - @backstage/plugin-kubernetes-backend@0.17.0 + - @backstage/backend-common@0.21.7 + - @backstage/plugin-azure-devops-backend@0.6.4 + - @backstage/plugin-techdocs-backend@1.10.4 + - @backstage/plugin-permission-node@0.7.28 + - @backstage/plugin-auth-backend@0.22.4 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.3 + - @backstage/plugin-catalog-backend@1.21.1 + - @backstage/plugin-events-backend@0.3.4 + - @backstage/plugin-tech-insights-node@0.6.0 + - @backstage/plugin-search-backend@1.5.7 + - @backstage/plugin-todo-backend@0.3.16 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.49 + - @backstage/plugin-search-backend-module-techdocs@0.1.22 + - @backstage/plugin-search-backend-module-explore@0.1.21 + - @backstage/plugin-entity-feedback-backend@0.2.14 + - @backstage/plugin-code-coverage-backend@0.2.31 + - @backstage/plugin-tech-insights-backend@0.5.31 + - @backstage/plugin-search-backend-node@1.2.21 + - @backstage/plugin-lighthouse-backend@0.4.10 + - @backstage/plugin-permission-backend@0.5.41 + - @backstage/plugin-devtools-backend@0.3.3 + - @backstage/plugin-linguist-backend@0.5.15 + - @backstage/plugin-playlist-backend@0.3.21 + - @backstage/plugin-explore-backend@0.0.27 + - @backstage/plugin-jenkins-backend@0.4.4 + - @backstage/backend-tasks@0.5.22 + - @backstage/plugin-kafka-backend@0.3.15 + - @backstage/plugin-nomad-backend@0.1.19 + - @backstage/plugin-adr-backend@0.4.14 + - @backstage/plugin-app-backend@0.3.65 + - @backstage/plugin-auth-node@0.4.12 + - @backstage/plugin-signals-backend@0.1.3 + - @backstage/plugin-proxy-backend@0.4.15 + - @backstage/plugin-scaffolder-backend@1.22.4 + - @backstage/catalog-client@1.6.4 + - @backstage/integration@1.10.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.4.0 + - example-app@0.2.96 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4 + - @backstage/plugin-events-node@0.3.3 + - @backstage/plugin-rollbar-backend@0.1.62 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.18 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.34 + - @backstage/plugin-search-backend-module-catalog@0.1.22 + - @backstage/plugin-signals-node@0.1.3 + - @backstage/plugin-catalog-node@1.11.1 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/plugin-azure-sites-common@0.1.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15 + - @backstage/plugin-permission-common@0.7.13 + +## 0.2.97-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.17.0-next.1 + - @backstage/backend-common@0.21.7-next.1 + - @backstage/plugin-azure-devops-backend@0.6.4-next.1 + - @backstage/plugin-techdocs-backend@1.10.4-next.1 + - @backstage/plugin-events-backend@0.3.4-next.1 + - @backstage/plugin-auth-backend@0.22.4-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + - @backstage/plugin-proxy-backend@0.4.15-next.1 + - @backstage/plugin-scaffolder-backend@1.22.4-next.1 + - @backstage/plugin-catalog-backend@1.21.1-next.1 + - @backstage/catalog-client@1.6.4-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.3-next.1 + - @backstage/plugin-app-backend@0.3.65-next.1 + - @backstage/backend-tasks@0.5.22-next.1 + - @backstage/plugin-adr-backend@0.4.14-next.1 + - @backstage/plugin-badges-backend@0.3.14-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4-next.1 + - @backstage/plugin-code-coverage-backend@0.2.31-next.1 + - @backstage/plugin-devtools-backend@0.3.3-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.14-next.1 + - @backstage/plugin-events-node@0.3.3-next.1 + - @backstage/plugin-explore-backend@0.0.27-next.1 + - @backstage/plugin-jenkins-backend@0.4.4-next.1 + - @backstage/plugin-kafka-backend@0.3.15-next.1 + - @backstage/plugin-lighthouse-backend@0.4.10-next.1 + - @backstage/plugin-linguist-backend@0.5.15-next.1 + - @backstage/plugin-nomad-backend@0.1.19-next.1 + - @backstage/plugin-permission-backend@0.5.41-next.1 + - @backstage/plugin-permission-node@0.7.28-next.1 + - @backstage/plugin-playlist-backend@0.3.21-next.1 + - @backstage/plugin-rollbar-backend@0.1.62-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.18-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.34-next.1 + - @backstage/plugin-search-backend@1.5.7-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.22-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.20-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.21-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.26-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.22-next.1 + - @backstage/plugin-search-backend-node@1.2.21-next.1 + - @backstage/plugin-signals-backend@0.1.3-next.1 + - @backstage/plugin-signals-node@0.1.3-next.1 + - @backstage/plugin-tech-insights-backend@0.5.31-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.49-next.1 + - @backstage/plugin-tech-insights-node@0.5.3-next.1 + - @backstage/plugin-todo-backend@0.3.16-next.1 + - example-app@0.2.96-next.1 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/integration@1.10.0-next.0 + - @backstage/plugin-azure-sites-common@0.1.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15-next.1 + - @backstage/plugin-catalog-node@1.11.1-next.1 + - @backstage/plugin-permission-common@0.7.13 + +## 0.2.97-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-backend@1.10.4-next.0 + - @backstage/plugin-catalog-backend@1.21.1-next.0 + - @backstage/plugin-kubernetes-backend@0.16.4-next.0 + - @backstage/plugin-signals-backend@0.1.3-next.0 + - @backstage/backend-common@0.21.7-next.0 + - @backstage/integration@1.10.0-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.22-next.0 + - @backstage/plugin-scaffolder-backend@1.22.4-next.0 + - @backstage/plugin-app-backend@0.3.65-next.0 + - example-app@0.2.96-next.0 + - @backstage/backend-tasks@0.5.22-next.0 + - @backstage/catalog-client@1.6.3 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/plugin-adr-backend@0.4.14-next.0 + - @backstage/plugin-auth-backend@0.22.4-next.0 + - @backstage/plugin-auth-node@0.4.12-next.0 + - @backstage/plugin-azure-devops-backend@0.6.4-next.0 + - @backstage/plugin-azure-sites-common@0.1.3 + - @backstage/plugin-badges-backend@0.3.14-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4-next.0 + - @backstage/plugin-catalog-node@1.11.1-next.0 + - @backstage/plugin-code-coverage-backend@0.2.31-next.0 + - @backstage/plugin-devtools-backend@0.3.3-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.14-next.0 + - @backstage/plugin-events-backend@0.3.3-next.0 + - @backstage/plugin-events-node@0.3.3-next.0 + - @backstage/plugin-explore-backend@0.0.27-next.0 + - @backstage/plugin-jenkins-backend@0.4.4-next.0 + - @backstage/plugin-kafka-backend@0.3.15-next.0 + - @backstage/plugin-lighthouse-backend@0.4.10-next.0 + - @backstage/plugin-linguist-backend@0.5.15-next.0 + - @backstage/plugin-nomad-backend@0.1.19-next.0 + - @backstage/plugin-permission-backend@0.5.41-next.0 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-permission-node@0.7.28-next.0 + - @backstage/plugin-playlist-backend@0.3.21-next.0 + - @backstage/plugin-proxy-backend@0.4.15-next.0 + - @backstage/plugin-rollbar-backend@0.1.62-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.18-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.3-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.34-next.0 + - @backstage/plugin-search-backend@1.5.7-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.22-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.20-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.21-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.26-next.0 + - @backstage/plugin-search-backend-node@1.2.21-next.0 + - @backstage/plugin-signals-node@0.1.3-next.0 + - @backstage/plugin-tech-insights-backend@0.5.31-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.49-next.0 + - @backstage/plugin-tech-insights-node@0.5.3-next.0 + - @backstage/plugin-todo-backend@0.3.16-next.0 + +## 0.2.96 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.21.0 + - @backstage/plugin-catalog-node@1.11.0 + - @backstage/plugin-kubernetes-backend@0.16.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.3 + - @backstage/plugin-permission-backend@0.5.40 + - @backstage/plugin-proxy-backend@0.4.14 + - @backstage/plugin-scaffolder-backend@1.22.3 + - @backstage/catalog-client@1.6.3 + - @backstage/plugin-jenkins-backend@0.4.3 + - @backstage/plugin-auth-backend@0.22.3 + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-common@0.21.6 + - @backstage/plugin-azure-devops-backend@0.6.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.14 + - @backstage/plugin-lighthouse-backend@0.4.9 + - @backstage/plugin-linguist-backend@0.5.14 + - @backstage/plugin-search-backend-module-catalog@0.1.21 + - @backstage/plugin-search-backend-module-techdocs@0.1.21 + - @backstage/plugin-todo-backend@0.3.15 + - example-app@0.2.95 + - @backstage/plugin-app-backend@0.3.64 + - @backstage/plugin-adr-backend@0.4.13 + - @backstage/plugin-badges-backend@0.3.13 + - @backstage/plugin-code-coverage-backend@0.2.30 + - @backstage/plugin-entity-feedback-backend@0.2.13 + - @backstage/plugin-playlist-backend@0.3.20 + - @backstage/plugin-tech-insights-backend@0.5.30 + - @backstage/plugin-techdocs-backend@1.10.3 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.2 + - @backstage/plugin-permission-node@0.7.27 + - @backstage/plugin-signals-backend@0.1.2 + - @backstage/plugin-signals-node@0.1.2 + - @backstage/backend-tasks@0.5.21 + - @backstage/plugin-devtools-backend@0.3.2 + - @backstage/plugin-events-backend@0.3.2 + - @backstage/plugin-events-node@0.3.2 + - @backstage/plugin-explore-backend@0.0.26 + - @backstage/plugin-kafka-backend@0.3.14 + - @backstage/plugin-nomad-backend@0.1.18 + - @backstage/plugin-rollbar-backend@0.1.61 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.17 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.33 + - @backstage/plugin-search-backend@1.5.6 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.19 + - @backstage/plugin-search-backend-module-explore@0.1.20 + - @backstage/plugin-search-backend-module-pg@0.5.25 + - @backstage/plugin-search-backend-node@1.2.20 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.48 + - @backstage/plugin-tech-insights-node@0.5.2 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/integration@1.9.1 + - @backstage/plugin-azure-sites-common@0.1.3 + - @backstage/plugin-permission-common@0.7.13 + +## 0.2.95 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.20.0 + - @backstage/plugin-catalog-node@1.10.0 + - @backstage/plugin-kubernetes-backend@0.16.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.2 + - @backstage/plugin-permission-backend@0.5.39 + - @backstage/catalog-client@1.6.2 + - @backstage/backend-common@0.21.5 + - @backstage/plugin-auth-backend@0.22.2 + - @backstage/plugin-azure-devops-backend@0.6.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.13 + - @backstage/plugin-jenkins-backend@0.4.2 + - @backstage/plugin-lighthouse-backend@0.4.8 + - @backstage/plugin-linguist-backend@0.5.13 + - @backstage/plugin-scaffolder-backend@1.22.2 + - @backstage/plugin-search-backend-module-catalog@0.1.20 + - @backstage/plugin-search-backend-module-techdocs@0.1.20 + - @backstage/plugin-todo-backend@0.3.14 + - example-app@0.2.94 + - @backstage/plugin-app-backend@0.3.63 + - @backstage/plugin-adr-backend@0.4.12 + - @backstage/plugin-auth-node@0.4.10 + - @backstage/plugin-badges-backend@0.3.12 + - @backstage/plugin-code-coverage-backend@0.2.29 + - @backstage/plugin-entity-feedback-backend@0.2.12 + - @backstage/plugin-playlist-backend@0.3.19 + - @backstage/plugin-tech-insights-backend@0.5.29 + - @backstage/plugin-techdocs-backend@1.10.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.1 + - @backstage/backend-tasks@0.5.20 + - @backstage/plugin-devtools-backend@0.3.1 + - @backstage/plugin-events-backend@0.3.1 + - @backstage/plugin-events-node@0.3.1 + - @backstage/plugin-explore-backend@0.0.25 + - @backstage/plugin-kafka-backend@0.3.13 + - @backstage/plugin-nomad-backend@0.1.17 + - @backstage/plugin-permission-node@0.7.26 + - @backstage/plugin-proxy-backend@0.4.13 + - @backstage/plugin-rollbar-backend@0.1.60 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.16 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.32 + - @backstage/plugin-search-backend@1.5.5 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.18 + - @backstage/plugin-search-backend-module-explore@0.1.19 + - @backstage/plugin-search-backend-module-pg@0.5.24 + - @backstage/plugin-search-backend-node@1.2.19 + - @backstage/plugin-signals-backend@0.1.1 + - @backstage/plugin-signals-node@0.1.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.47 + - @backstage/plugin-tech-insights-node@0.5.1 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/integration@1.9.1 + - @backstage/plugin-azure-sites-common@0.1.3 + - @backstage/plugin-permission-common@0.7.13 + +## 0.2.94 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.19.0 + - @backstage/plugin-catalog-node@1.9.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.1 + - @backstage/plugin-permission-backend@0.5.38 + - @backstage/plugin-auth-backend@0.22.1 + - @backstage/plugin-azure-devops-backend@0.6.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.12 + - @backstage/plugin-jenkins-backend@0.4.1 + - @backstage/plugin-kubernetes-backend@0.16.1 + - @backstage/plugin-lighthouse-backend@0.4.7 + - @backstage/plugin-linguist-backend@0.5.12 + - @backstage/plugin-scaffolder-backend@1.22.1 + - @backstage/plugin-search-backend-module-catalog@0.1.19 + - @backstage/plugin-search-backend-module-techdocs@0.1.19 + - @backstage/plugin-todo-backend@0.3.13 + - @backstage/plugin-techdocs-backend@1.10.1 + +## 0.2.93 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-backend@0.3.0 + - @backstage/plugin-events-node@0.3.0 + - @backstage/plugin-scaffolder-backend@1.22.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.31 + - @backstage/plugin-linguist-backend@0.5.11 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.0 + - @backstage/plugin-catalog-backend@1.18.0 + - @backstage/plugin-code-coverage-backend@0.2.28 + - @backstage/plugin-devtools-backend@0.3.0 + - @backstage/plugin-jenkins-backend@0.4.0 + - @backstage/plugin-search-backend@1.5.4 + - @backstage/backend-common@0.21.4 + - @backstage/integration@1.9.1 + - @backstage/plugin-auth-node@0.4.9 + - @backstage/plugin-lighthouse-backend@0.4.6 + - @backstage/config@1.2.0 + - @backstage/plugin-azure-devops-backend@0.6.0 + - @backstage/plugin-permission-backend@0.5.37 + - @backstage/plugin-signals-backend@0.1.0 + - @backstage/plugin-nomad-backend@0.1.16 + - @backstage/plugin-entity-feedback-backend@0.2.11 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.17 + - @backstage/plugin-search-backend-module-pg@0.5.23 + - @backstage/plugin-signals-node@0.1.0 + - @backstage/plugin-playlist-backend@0.3.18 + - @backstage/plugin-auth-backend@0.22.0 + - @backstage/plugin-techdocs-backend@1.10.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.15 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.0 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-search-backend-module-techdocs@0.1.18 + - @backstage/plugin-search-backend-module-catalog@0.1.18 + - @backstage/plugin-search-backend-module-explore@0.1.18 + - @backstage/plugin-catalog-node@1.8.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.46 + - @backstage/catalog-client@1.6.1 + - @backstage/plugin-kubernetes-backend@0.16.0 + - @backstage/plugin-adr-backend@0.4.11 + - @backstage/plugin-proxy-backend@0.4.12 + - @backstage/backend-tasks@0.5.19 + - @backstage/plugin-search-backend-node@1.2.18 + - @backstage/plugin-tech-insights-backend@0.5.28 + - @backstage/plugin-app-backend@0.3.62 + - @backstage/plugin-permission-node@0.7.25 + - @backstage/plugin-todo-backend@0.3.12 + - @backstage/plugin-tech-insights-node@0.5.0 + - @backstage/plugin-badges-backend@0.3.11 + - example-app@0.2.93 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11 + - @backstage/plugin-explore-backend@0.0.24 + - @backstage/plugin-rollbar-backend@0.1.59 + - @backstage/plugin-kafka-backend@0.3.12 + - @backstage/catalog-model@1.4.5 + - @backstage/plugin-azure-sites-common@0.1.3 + +## 0.2.93-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.22.0-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.31-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.11-next.2 + - @backstage/plugin-catalog-backend@1.18.0-next.2 + - @backstage/plugin-code-coverage-backend@0.2.28-next.2 + - @backstage/plugin-devtools-backend@0.3.0-next.2 + - @backstage/plugin-jenkins-backend@0.4.0-next.2 + - @backstage/plugin-search-backend@1.5.4-next.2 + - @backstage/integration@1.9.1-next.2 + - @backstage/plugin-techdocs-backend@1.10.0-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.0-next.2 + - @backstage/plugin-signals-node@0.1.0-next.2 + - @backstage/catalog-client@1.6.1-next.1 + - @backstage/plugin-linguist-backend@0.5.11-next.2 + - @backstage/plugin-kubernetes-backend@0.16.0-next.2 + - @backstage/plugin-todo-backend@0.3.12-next.2 + - @backstage/plugin-signals-backend@0.1.0-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.15-next.2 + - @backstage/backend-common@0.21.4-next.2 + - @backstage/plugin-adr-backend@0.4.11-next.2 + - @backstage/plugin-azure-devops-backend@0.6.0-next.2 + - example-app@0.2.93-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.18-next.2 + - @backstage/plugin-auth-backend@0.22.0-next.2 + - @backstage/plugin-app-backend@0.3.62-next.2 + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/plugin-badges-backend@0.3.11-next.2 + - @backstage/plugin-catalog-node@1.8.0-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.11-next.2 + - @backstage/plugin-lighthouse-backend@0.4.6-next.2 + - @backstage/plugin-playlist-backend@0.3.18-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.18-next.2 + - @backstage/plugin-tech-insights-backend@0.5.28-next.2 + - @backstage/backend-tasks@0.5.19-next.2 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/config@1.2.0-next.1 + - @backstage/plugin-azure-sites-common@0.1.3-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11-next.2 + - @backstage/plugin-events-backend@0.3.0-next.2 + - @backstage/plugin-events-node@0.3.0-next.2 + - @backstage/plugin-explore-backend@0.0.24-next.2 + - @backstage/plugin-kafka-backend@0.3.12-next.2 + - @backstage/plugin-nomad-backend@0.1.16-next.2 + - @backstage/plugin-permission-backend@0.5.37-next.2 + - @backstage/plugin-permission-common@0.7.13-next.1 + - @backstage/plugin-permission-node@0.7.25-next.2 + - @backstage/plugin-proxy-backend@0.4.12-next.2 + - @backstage/plugin-rollbar-backend@0.1.59-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.17-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.18-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.23-next.2 + - @backstage/plugin-search-backend-node@1.2.18-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.46-next.2 + - @backstage/plugin-tech-insights-node@0.5.0-next.2 + +## 0.2.93-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.11-next.1 + - @backstage/plugin-scaffolder-backend@1.22.0-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.17-next.1 + - @backstage/plugin-app-backend@0.3.62-next.1 + - @backstage/plugin-signals-backend@0.1.0-next.1 + - @backstage/plugin-signals-node@0.1.0-next.1 + - @backstage/plugin-azure-devops-backend@0.6.0-next.1 + - @backstage/plugin-kubernetes-backend@0.16.0-next.1 + - example-app@0.2.93-next.1 + - @backstage/backend-common@0.21.4-next.1 + - @backstage/backend-tasks@0.5.19-next.1 + - @backstage/integration@1.9.1-next.1 + - @backstage/plugin-adr-backend@0.4.11-next.1 + - @backstage/plugin-auth-backend@0.22.0-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + - @backstage/plugin-badges-backend@0.3.11-next.1 + - @backstage/plugin-catalog-backend@1.18.0-next.1 + - @backstage/plugin-code-coverage-backend@0.2.28-next.1 + - @backstage/plugin-devtools-backend@0.3.0-next.1 + - @backstage/plugin-events-backend@0.3.0-next.1 + - @backstage/plugin-explore-backend@0.0.24-next.1 + - @backstage/plugin-jenkins-backend@0.4.0-next.1 + - @backstage/plugin-kafka-backend@0.3.12-next.1 + - @backstage/plugin-lighthouse-backend@0.4.6-next.1 + - @backstage/plugin-linguist-backend@0.5.11-next.1 + - @backstage/plugin-nomad-backend@0.1.16-next.1 + - @backstage/plugin-permission-backend@0.5.37-next.1 + - @backstage/plugin-permission-common@0.7.13-next.1 + - @backstage/plugin-permission-node@0.7.25-next.1 + - @backstage/plugin-playlist-backend@0.3.18-next.1 + - @backstage/plugin-proxy-backend@0.4.12-next.1 + - @backstage/plugin-rollbar-backend@0.1.59-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.15-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.2.17-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.31-next.1 + - @backstage/plugin-search-backend@1.5.4-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.18-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.18-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.23-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.18-next.1 + - @backstage/plugin-search-backend-node@1.2.18-next.1 + - @backstage/plugin-tech-insights-backend@0.5.28-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.46-next.1 + - @backstage/plugin-tech-insights-node@0.5.0-next.1 + - @backstage/plugin-techdocs-backend@1.9.7-next.1 + - @backstage/plugin-todo-backend@0.3.12-next.1 + - @backstage/catalog-client@1.6.1-next.0 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/plugin-azure-sites-common@0.1.3-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.11-next.1 + - @backstage/plugin-catalog-node@1.8.0-next.1 + - @backstage/plugin-events-node@0.3.0-next.1 + +## 0.2.93-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-backend@0.3.0-next.0 + - @backstage/plugin-events-node@0.3.0-next.0 + - @backstage/plugin-linguist-backend@0.5.10-next.0 + - @backstage/backend-common@0.21.3-next.0 + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/plugin-lighthouse-backend@0.4.5-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.16-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.22-next.0 + - @backstage/plugin-playlist-backend@0.3.17-next.0 + - @backstage/plugin-code-coverage-backend@0.2.27-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.10-next.0 + - @backstage/plugin-catalog-backend@1.18.0-next.0 + - @backstage/plugin-auth-backend@0.22.0-next.0 + - @backstage/plugin-jenkins-backend@0.4.0-next.0 + - @backstage/plugin-azure-devops-backend@0.6.0-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.14-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.2.16-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.30-next.0 + - @backstage/plugin-scaffolder-backend@1.22.0-next.0 + - @backstage/plugin-permission-common@0.7.13-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.17-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.17-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.17-next.0 + - @backstage/plugin-catalog-node@1.8.0-next.0 + - @backstage/plugin-kubernetes-backend@0.16.0-next.0 + - @backstage/plugin-adr-backend@0.4.10-next.0 + - @backstage/plugin-proxy-backend@0.4.11-next.0 + - @backstage/backend-tasks@0.5.18-next.0 + - @backstage/plugin-search-backend-node@1.2.17-next.0 + - @backstage/plugin-signals-backend@0.0.4-next.0 + - @backstage/plugin-signals-node@0.0.4-next.0 + - @backstage/plugin-tech-insights-backend@0.5.27-next.0 + - @backstage/plugin-search-backend@1.5.3-next.0 + - @backstage/plugin-devtools-backend@0.3.0-next.0 + - @backstage/plugin-permission-node@0.7.24-next.0 + - @backstage/plugin-tech-insights-node@0.5.0-next.0 + - @backstage/plugin-badges-backend@0.3.10-next.0 + - @backstage/plugin-permission-backend@0.5.36-next.0 + - @backstage/plugin-app-backend@0.3.61-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.10-next.0 + - @backstage/plugin-explore-backend@0.0.23-next.0 + - @backstage/plugin-rollbar-backend@0.1.58-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.45-next.0 + - @backstage/plugin-techdocs-backend@1.9.6-next.0 + - @backstage/plugin-kafka-backend@0.3.11-next.0 + - @backstage/plugin-nomad-backend@0.1.15-next.0 + - @backstage/plugin-todo-backend@0.3.11-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.10-next.0 + - example-app@0.2.93-next.0 + - @backstage/catalog-client@1.6.1-next.0 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/config@1.1.2-next.0 + - @backstage/integration@1.9.1-next.0 + - @backstage/plugin-azure-sites-common@0.1.3-next.0 + +## 0.2.92 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.27 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7 + - @backstage/plugin-scaffolder-backend@1.21.0 + - @backstage/plugin-badges-backend@0.3.7 + - @backstage/plugin-azure-devops-backend@0.5.2 + - @backstage/plugin-explore-backend@0.0.20 + - @backstage/plugin-auth-backend@0.21.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.42 + - @backstage/plugin-auth-node@0.4.4 + - @backstage/plugin-entity-feedback-backend@0.2.7 + - @backstage/plugin-lighthouse-backend@0.4.2 + - @backstage/plugin-devtools-backend@0.2.7 + - @backstage/plugin-linguist-backend@0.5.7 + - @backstage/plugin-adr-backend@0.4.7 + - @backstage/plugin-kubernetes-backend@0.15.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.11 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.2.13 + - @backstage/plugin-signals-backend@0.0.1 + - @backstage/plugin-signals-node@0.0.1 + - @backstage/plugin-tech-insights-backend@0.5.24 + - @backstage/plugin-tech-insights-node@0.4.16 + - @backstage/plugin-search-backend-module-techdocs@0.1.14 + - @backstage/plugin-search-backend-module-catalog@0.1.14 + - @backstage/plugin-search-backend-module-explore@0.1.14 + - @backstage/plugin-code-coverage-backend@0.2.24 + - @backstage/plugin-playlist-backend@0.3.14 + - @backstage/plugin-catalog-backend@1.17.0 + - @backstage/plugin-jenkins-backend@0.3.4 + - @backstage/plugin-rollbar-backend@0.1.55 + - @backstage/backend-tasks@0.5.15 + - @backstage/plugin-events-backend@0.2.19 + - @backstage/plugin-nomad-backend@0.1.12 + - @backstage/plugin-app-backend@0.3.58 + - @backstage/catalog-model@1.4.4 + - @backstage/integration@1.9.0 + - @backstage/catalog-client@1.6.0 + - @backstage/plugin-search-backend@1.5.0 + - @backstage/plugin-todo-backend@0.3.8 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7 + - @backstage/plugin-techdocs-backend@1.9.3 + - @backstage/plugin-catalog-node@1.7.0 + - @backstage/plugin-azure-sites-common@0.1.2 + - example-app@0.2.92 + - @backstage/plugin-kafka-backend@0.3.8 + - @backstage/plugin-permission-backend@0.5.33 + - @backstage/plugin-permission-node@0.7.21 + - @backstage/plugin-proxy-backend@0.4.8 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.13 + - @backstage/plugin-search-backend-module-pg@0.5.19 + - @backstage/plugin-search-backend-node@1.2.14 + - @backstage/config@1.1.1 + - @backstage/plugin-events-node@0.2.19 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-search-common@1.2.10 + +## 0.2.92-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.3 + - @backstage/plugin-badges-backend@0.3.7-next.3 + - @backstage/plugin-kubernetes-backend@0.15.0-next.3 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.2.13-next.3 + - @backstage/integration@1.9.0-next.1 + - @backstage/backend-tasks@0.5.15-next.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.3 + - @backstage/plugin-signals-backend@0.0.1-next.3 + - @backstage/plugin-signals-node@0.0.1-next.3 + - @backstage/plugin-catalog-backend@1.17.0-next.3 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.11-next.3 + - @backstage/plugin-app-backend@0.3.58-next.3 + - @backstage/plugin-auth-backend@0.21.0-next.3 + - @backstage/plugin-catalog-node@1.6.2-next.3 + - @backstage/plugin-adr-backend@0.4.7-next.3 + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/plugin-azure-devops-backend@0.5.2-next.3 + - @backstage/plugin-code-coverage-backend@0.2.24-next.3 + - @backstage/plugin-devtools-backend@0.2.7-next.3 + - @backstage/plugin-entity-feedback-backend@0.2.7-next.3 + - @backstage/plugin-events-backend@0.2.19-next.3 + - @backstage/plugin-explore-backend@0.0.20-next.3 + - @backstage/plugin-jenkins-backend@0.3.4-next.3 + - @backstage/plugin-kafka-backend@0.3.8-next.3 + - @backstage/plugin-lighthouse-backend@0.4.2-next.3 + - @backstage/plugin-linguist-backend@0.5.7-next.3 + - @backstage/plugin-nomad-backend@0.1.12-next.3 + - @backstage/plugin-permission-backend@0.5.33-next.3 + - @backstage/plugin-permission-node@0.7.21-next.3 + - @backstage/plugin-playlist-backend@0.3.14-next.3 + - @backstage/plugin-proxy-backend@0.4.8-next.3 + - @backstage/plugin-rollbar-backend@0.1.55-next.3 + - @backstage/plugin-scaffolder-backend@1.21.0-next.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.27-next.3 + - @backstage/plugin-search-backend@1.5.0-next.3 + - @backstage/plugin-search-backend-module-catalog@0.1.14-next.3 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.13-next.3 + - @backstage/plugin-search-backend-module-explore@0.1.14-next.3 + - @backstage/plugin-search-backend-module-pg@0.5.19-next.3 + - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.3 + - @backstage/plugin-search-backend-node@1.2.14-next.3 + - @backstage/plugin-tech-insights-backend@0.5.24-next.3 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.42-next.3 + - @backstage/plugin-tech-insights-node@0.4.16-next.3 + - @backstage/plugin-techdocs-backend@1.9.3-next.3 + - @backstage/plugin-todo-backend@0.3.8-next.3 + - example-app@0.2.92-next.3 + - @backstage/catalog-client@1.6.0-next.1 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/config@1.1.1 + - @backstage/plugin-azure-sites-common@0.1.2-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.3 + - @backstage/plugin-events-node@0.2.19-next.3 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-search-common@1.2.10 + +## 0.2.92-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.21.0-next.2 + - @backstage/plugin-auth-backend@0.21.0-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.42-next.2 + - @backstage/backend-common@0.21.0-next.2 + - @backstage/plugin-signals-backend@0.0.1-next.2 + - @backstage/plugin-signals-node@0.0.1-next.2 + - @backstage/plugin-kubernetes-backend@0.15.0-next.2 + - @backstage/plugin-tech-insights-backend@0.5.24-next.2 + - @backstage/plugin-tech-insights-node@0.4.16-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.11-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.27-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.14-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.14-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.7-next.2 + - @backstage/plugin-code-coverage-backend@0.2.24-next.2 + - @backstage/plugin-azure-devops-backend@0.5.2-next.2 + - @backstage/plugin-lighthouse-backend@0.4.2-next.2 + - @backstage/plugin-devtools-backend@0.2.7-next.2 + - @backstage/plugin-linguist-backend@0.5.7-next.2 + - @backstage/plugin-playlist-backend@0.3.14-next.2 + - @backstage/plugin-catalog-backend@1.17.0-next.2 + - @backstage/plugin-explore-backend@0.0.20-next.2 + - @backstage/plugin-jenkins-backend@0.3.4-next.2 + - @backstage/plugin-rollbar-backend@0.1.55-next.2 + - @backstage/backend-tasks@0.5.15-next.2 + - @backstage/plugin-badges-backend@0.3.7-next.2 + - @backstage/plugin-events-backend@0.2.19-next.2 + - @backstage/plugin-nomad-backend@0.1.12-next.2 + - @backstage/plugin-adr-backend@0.4.7-next.2 + - @backstage/plugin-app-backend@0.3.58-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + - example-app@0.2.92-next.2 + - @backstage/plugin-todo-backend@0.3.8-next.2 + - @backstage/plugin-kafka-backend@0.3.8-next.2 + - @backstage/plugin-permission-backend@0.5.33-next.2 + - @backstage/plugin-permission-node@0.7.21-next.2 + - @backstage/plugin-proxy-backend@0.4.8-next.2 + - @backstage/plugin-search-backend@1.5.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.13-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.19-next.2 + - @backstage/plugin-search-backend-node@1.2.14-next.2 + - @backstage/plugin-techdocs-backend@1.9.3-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.2 + - @backstage/plugin-catalog-node@1.6.2-next.2 + - @backstage/plugin-events-node@0.2.19-next.2 + - @backstage/config@1.1.1 + - @backstage/catalog-client@1.6.0-next.1 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/integration@1.9.0-next.0 + - @backstage/plugin-azure-sites-common@0.1.2-next.0 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-search-common@1.2.10 + +## 0.2.92-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.21.0-next.1 + - @backstage/plugin-azure-devops-backend@0.5.2-next.1 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/catalog-client@1.6.0-next.1 + - @backstage/plugin-catalog-backend@1.17.0-next.1 + - @backstage/backend-common@0.21.0-next.1 + - @backstage/plugin-auth-backend@0.20.4-next.1 + - @backstage/integration@1.9.0-next.0 + - @backstage/plugin-azure-sites-common@0.1.2-next.0 + - example-app@0.2.92-next.1 + - @backstage/backend-tasks@0.5.15-next.1 + - @backstage/config@1.1.1 + - @backstage/plugin-adr-backend@0.4.7-next.1 + - @backstage/plugin-app-backend@0.3.58-next.1 + - @backstage/plugin-auth-node@0.4.4-next.1 + - @backstage/plugin-badges-backend@0.3.7-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.1 + - @backstage/plugin-catalog-node@1.6.2-next.1 + - @backstage/plugin-code-coverage-backend@0.2.24-next.1 + - @backstage/plugin-devtools-backend@0.2.7-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.7-next.1 + - @backstage/plugin-events-backend@0.2.19-next.1 + - @backstage/plugin-events-node@0.2.19-next.1 + - @backstage/plugin-explore-backend@0.0.20-next.1 + - @backstage/plugin-jenkins-backend@0.3.4-next.1 + - @backstage/plugin-kafka-backend@0.3.8-next.1 + - @backstage/plugin-kubernetes-backend@0.14.2-next.1 + - @backstage/plugin-lighthouse-backend@0.4.2-next.1 + - @backstage/plugin-linguist-backend@0.5.7-next.1 + - @backstage/plugin-nomad-backend@0.1.12-next.1 + - @backstage/plugin-permission-backend@0.5.33-next.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.21-next.1 + - @backstage/plugin-playlist-backend@0.3.14-next.1 + - @backstage/plugin-proxy-backend@0.4.8-next.1 + - @backstage/plugin-rollbar-backend@0.1.55-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.11-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.27-next.1 + - @backstage/plugin-search-backend@1.5.0-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.14-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.13-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.14-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.19-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.1 + - @backstage/plugin-search-backend-node@1.2.14-next.1 + - @backstage/plugin-search-common@1.2.10 + - @backstage/plugin-signals-backend@0.0.1-next.1 + - @backstage/plugin-signals-node@0.0.1-next.1 + - @backstage/plugin-tech-insights-backend@0.5.24-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.42-next.1 + - @backstage/plugin-tech-insights-node@0.4.16-next.1 + - @backstage/plugin-techdocs-backend@1.9.3-next.1 + - @backstage/plugin-todo-backend@0.3.8-next.1 + +## 0.2.92-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-rails@0.4.27-next.0 + - @backstage/plugin-azure-devops-backend@0.5.2-next.0 + - @backstage/plugin-explore-backend@0.0.20-next.0 + - @backstage/plugin-auth-backend@0.20.4-next.0 + - @backstage/backend-common@0.21.0-next.0 + - @backstage/plugin-kubernetes-backend@0.14.2-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.11-next.0 + - @backstage/plugin-catalog-backend@1.17.0-next.0 + - @backstage/plugin-search-backend@1.5.0-next.0 + - @backstage/plugin-todo-backend@0.3.8-next.0 + - @backstage/catalog-client@1.6.0-next.0 + - @backstage/plugin-signals-backend@0.0.1-next.0 + - @backstage/plugin-signals-node@0.0.1-next.0 + - @backstage/plugin-scaffolder-backend@1.21.0-next.0 + - @backstage/plugin-app-backend@0.3.58-next.0 + - example-app@0.2.92-next.0 + - @backstage/backend-tasks@0.5.15-next.0 + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/plugin-badges-backend@0.3.7-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.0 + - @backstage/plugin-catalog-node@1.6.2-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.7-next.0 + - @backstage/plugin-events-backend@0.2.19-next.0 + - @backstage/plugin-linguist-backend@0.5.7-next.0 + - @backstage/plugin-permission-node@0.7.21-next.0 + - @backstage/plugin-playlist-backend@0.3.14-next.0 + - @backstage/plugin-proxy-backend@0.4.8-next.0 + - @backstage/plugin-rollbar-backend@0.1.55-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.14-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.14-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.19-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.0 + - @backstage/plugin-tech-insights-backend@0.5.24-next.0 + - @backstage/plugin-techdocs-backend@1.9.3-next.0 + - @backstage/plugin-adr-backend@0.4.7-next.0 + - @backstage/plugin-azure-sites-backend@0.1.20-next.0 + - @backstage/plugin-code-coverage-backend@0.2.24-next.0 + - @backstage/plugin-devtools-backend@0.2.7-next.0 + - @backstage/plugin-jenkins-backend@0.3.4-next.0 + - @backstage/plugin-kafka-backend@0.3.8-next.0 + - @backstage/plugin-lighthouse-backend@0.4.2-next.0 + - @backstage/plugin-nomad-backend@0.1.12-next.0 + - @backstage/plugin-permission-backend@0.5.33-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.13-next.0 + - @backstage/plugin-search-backend-node@1.2.14-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.42-next.0 + - @backstage/plugin-tech-insights-node@0.4.16-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.0 + - @backstage/plugin-events-node@0.2.19-next.0 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-search-common@1.2.10 + +## 0.2.91 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.20.3 + - @backstage/backend-common@0.20.1 + - @backstage/plugin-scaffolder-backend@1.20.0 + - @backstage/catalog-client@1.5.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10 + - @backstage/plugin-events-backend@0.2.18 + - @backstage/plugin-search-backend-module-techdocs@0.1.13 + - @backstage/plugin-search-backend-module-catalog@0.1.13 + - @backstage/plugin-search-backend-module-explore@0.1.13 + - @backstage/plugin-azure-devops-backend@0.5.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41 + - @backstage/plugin-entity-feedback-backend@0.2.6 + - @backstage/plugin-code-coverage-backend@0.2.23 + - @backstage/plugin-azure-sites-backend@0.1.19 + - @backstage/plugin-tech-insights-node@0.4.15 + - @backstage/plugin-devtools-backend@0.2.6 + - @backstage/plugin-linguist-backend@0.5.6 + - @backstage/plugin-playlist-backend@0.3.13 + - @backstage/plugin-techdocs-backend@1.9.2 + - @backstage/plugin-explore-backend@0.0.19 + - @backstage/plugin-jenkins-backend@0.3.3 + - @backstage/plugin-badges-backend@0.3.6 + - @backstage/plugin-search-backend@1.4.9 + - @backstage/plugin-kafka-backend@0.3.7 + - @backstage/plugin-nomad-backend@0.1.11 + - @backstage/plugin-catalog-node@1.6.1 + - @backstage/plugin-todo-backend@0.3.7 + - @backstage/plugin-adr-backend@0.4.6 + - @backstage/plugin-app-backend@0.3.57 + - @backstage/plugin-permission-backend@0.5.32 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-catalog-backend@1.16.1 + - example-app@0.2.91 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-kubernetes-backend@0.14.1 + - @backstage/plugin-lighthouse-backend@0.4.1 + - @backstage/plugin-proxy-backend@0.4.7 + - @backstage/plugin-rollbar-backend@0.1.54 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.26 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.12 + - @backstage/plugin-search-backend-module-pg@0.5.18 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/plugin-tech-insights-backend@0.5.23 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6 + - @backstage/plugin-events-node@0.2.18 + - @backstage/plugin-search-common@1.2.10 + +## 0.2.91-next.2 + +### Patch Changes + +- Updated dependencies + - example-app@0.2.91-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-adr-backend@0.4.6-next.2 + - @backstage/plugin-app-backend@0.3.57-next.2 + - @backstage/plugin-auth-backend@0.20.3-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-azure-devops-backend@0.5.1-next.2 + - @backstage/plugin-badges-backend@0.3.6-next.2 + - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.2 + - @backstage/plugin-catalog-node@1.6.1-next.2 + - @backstage/plugin-code-coverage-backend@0.2.23-next.2 + - @backstage/plugin-devtools-backend@0.2.6-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.6-next.2 + - @backstage/plugin-events-backend@0.2.18-next.2 + - @backstage/plugin-events-node@0.2.18-next.2 + - @backstage/plugin-jenkins-backend@0.3.3-next.2 + - @backstage/plugin-kafka-backend@0.3.7-next.2 + - @backstage/plugin-kubernetes-backend@0.14.1-next.2 + - @backstage/plugin-lighthouse-backend@0.4.1-next.2 + - @backstage/plugin-linguist-backend@0.5.6-next.2 + - @backstage/plugin-nomad-backend@0.1.11-next.2 + - @backstage/plugin-permission-backend@0.5.32-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-playlist-backend@0.3.13-next.2 + - @backstage/plugin-proxy-backend@0.4.7-next.2 + - @backstage/plugin-scaffolder-backend@1.19.3-next.2 + - @backstage/plugin-search-backend@1.4.9-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.13-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.12-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.13-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.18-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + - @backstage/plugin-techdocs-backend@1.9.2-next.2 + - @backstage/plugin-todo-backend@0.3.7-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/plugin-azure-sites-backend@0.1.19-next.2 + - @backstage/plugin-explore-backend@0.0.19-next.2 + - @backstage/plugin-rollbar-backend@0.1.54-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.26-next.2 + - @backstage/plugin-tech-insights-backend@0.5.23-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41-next.2 + - @backstage/plugin-tech-insights-node@0.4.15-next.2 + +## 0.2.91-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10-next.1 + - example-app@0.2.91-next.1 + - @backstage/backend-common@0.20.1-next.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-app-backend@0.3.57-next.1 + - @backstage/plugin-devtools-backend@0.2.6-next.1 + - @backstage/plugin-proxy-backend@0.4.7-next.1 + - @backstage/config@1.1.1 + - @backstage/plugin-kubernetes-backend@0.14.1-next.1 + - @backstage/backend-tasks@0.5.14-next.1 + - @backstage/plugin-adr-backend@0.4.6-next.1 + - @backstage/plugin-auth-backend@0.20.3-next.1 + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/plugin-azure-devops-backend@0.5.1-next.1 + - @backstage/plugin-azure-sites-backend@0.1.19-next.1 + - @backstage/plugin-badges-backend@0.3.6-next.1 + - @backstage/plugin-catalog-backend@1.16.1-next.1 + - @backstage/plugin-code-coverage-backend@0.2.23-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.6-next.1 + - @backstage/plugin-events-backend@0.2.18-next.1 + - @backstage/plugin-explore-backend@0.0.19-next.1 + - @backstage/plugin-jenkins-backend@0.3.3-next.1 + - @backstage/plugin-kafka-backend@0.3.7-next.1 + - @backstage/plugin-lighthouse-backend@0.4.1-next.1 + - @backstage/plugin-linguist-backend@0.5.6-next.1 + - @backstage/plugin-nomad-backend@0.1.11-next.1 + - @backstage/plugin-permission-backend@0.5.32-next.1 + - @backstage/plugin-permission-node@0.7.20-next.1 + - @backstage/plugin-playlist-backend@0.3.13-next.1 + - @backstage/plugin-rollbar-backend@0.1.54-next.1 + - @backstage/plugin-scaffolder-backend@1.19.3-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.26-next.1 + - @backstage/plugin-search-backend@1.4.9-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.13-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.12-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.13-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.18-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.1 + - @backstage/plugin-search-backend-node@1.2.13-next.1 + - @backstage/plugin-tech-insights-backend@0.5.23-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41-next.1 + - @backstage/plugin-tech-insights-node@0.4.15-next.1 + - @backstage/plugin-techdocs-backend@1.9.2-next.1 + - @backstage/plugin-todo-backend@0.3.7-next.1 + - @backstage/catalog-client@1.5.2-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.1 + - @backstage/plugin-catalog-node@1.6.1-next.1 + - @backstage/plugin-events-node@0.2.18-next.1 + - @backstage/plugin-permission-common@0.7.11 + - @backstage/plugin-search-common@1.2.9 + +## 0.2.91-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.20.3-next.0 + - @backstage/backend-common@0.20.1-next.0 + - @backstage/plugin-scaffolder-backend@1.19.3-next.0 + - @backstage/catalog-client@1.5.2-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.13-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.13-next.0 + - @backstage/plugin-azure-devops-backend@0.5.1-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.6-next.0 + - @backstage/plugin-code-coverage-backend@0.2.23-next.0 + - @backstage/plugin-azure-sites-backend@0.1.19-next.0 + - @backstage/plugin-tech-insights-node@0.4.15-next.0 + - @backstage/plugin-devtools-backend@0.2.6-next.0 + - @backstage/plugin-linguist-backend@0.5.6-next.0 + - @backstage/plugin-playlist-backend@0.3.13-next.0 + - @backstage/plugin-techdocs-backend@1.9.2-next.0 + - @backstage/plugin-explore-backend@0.0.19-next.0 + - @backstage/plugin-jenkins-backend@0.3.3-next.0 + - @backstage/plugin-badges-backend@0.3.6-next.0 + - @backstage/plugin-search-backend@1.4.9-next.0 + - @backstage/plugin-kafka-backend@0.3.7-next.0 + - @backstage/plugin-nomad-backend@0.1.11-next.0 + - @backstage/plugin-catalog-node@1.6.1-next.0 + - @backstage/plugin-todo-backend@0.3.7-next.0 + - @backstage/plugin-adr-backend@0.4.6-next.0 + - @backstage/plugin-app-backend@0.3.57-next.0 + - example-app@0.2.91-next.0 + - @backstage/backend-tasks@0.5.14-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0 + - @backstage/plugin-auth-node@0.4.3-next.0 + - @backstage/plugin-catalog-backend@1.16.1-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.0 + - @backstage/plugin-events-backend@0.2.18-next.0 + - @backstage/plugin-events-node@0.2.18-next.0 + - @backstage/plugin-kubernetes-backend@0.14.1-next.0 + - @backstage/plugin-lighthouse-backend@0.4.1-next.0 + - @backstage/plugin-permission-backend@0.5.32-next.0 + - @backstage/plugin-permission-common@0.7.11 + - @backstage/plugin-permission-node@0.7.20-next.0 + - @backstage/plugin-proxy-backend@0.4.7-next.0 + - @backstage/plugin-rollbar-backend@0.1.54-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.26-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.12-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.18-next.0 + - @backstage/plugin-search-backend-node@1.2.13-next.0 + - @backstage/plugin-search-common@1.2.9 + - @backstage/plugin-tech-insights-backend@0.5.23-next.0 + +## 0.2.90 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.20.1 + - @backstage/backend-common@0.20.0 + - @backstage/plugin-catalog-node@1.6.0 + - @backstage/plugin-techdocs-backend@1.9.1 + - @backstage/plugin-catalog-backend@1.16.0 + - @backstage/catalog-client@1.5.0 + - @backstage/plugin-azure-devops-backend@0.5.0 + - @backstage/plugin-scaffolder-backend@1.19.2 + - @backstage/backend-tasks@0.5.13 + - @backstage/plugin-lighthouse-backend@0.4.0 + - @backstage/plugin-kubernetes-backend@0.14.0 + - @backstage/integration@1.8.0 + - @backstage/plugin-azure-sites-backend@0.1.18 + - @backstage/plugin-auth-node@0.4.2 + - @backstage/plugin-permission-backend@0.5.31 + - @backstage/plugin-permission-common@0.7.11 + - @backstage/plugin-playlist-backend@0.3.12 + - @backstage/plugin-permission-node@0.7.19 + - @backstage/plugin-search-backend@1.4.8 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.11 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5 + - @backstage/plugin-search-backend-module-techdocs@0.1.12 + - @backstage/plugin-search-backend-module-catalog@0.1.12 + - @backstage/plugin-search-backend-module-explore@0.1.12 + - @backstage/plugin-search-backend-module-pg@0.5.17 + - @backstage/plugin-events-backend@0.2.17 + - example-app@0.2.90 + - @backstage/plugin-adr-backend@0.4.5 + - @backstage/plugin-app-backend@0.3.56 + - @backstage/plugin-badges-backend@0.3.5 + - @backstage/plugin-code-coverage-backend@0.2.22 + - @backstage/plugin-devtools-backend@0.2.5 + - @backstage/plugin-entity-feedback-backend@0.2.5 + - @backstage/plugin-explore-backend@0.0.18 + - @backstage/plugin-jenkins-backend@0.3.2 + - @backstage/plugin-kafka-backend@0.3.6 + - @backstage/plugin-linguist-backend@0.5.5 + - @backstage/plugin-nomad-backend@0.1.10 + - @backstage/plugin-proxy-backend@0.4.6 + - @backstage/plugin-rollbar-backend@0.1.53 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.9 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.25 + - @backstage/plugin-search-backend-node@1.2.12 + - @backstage/plugin-tech-insights-backend@0.5.22 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.40 + - @backstage/plugin-tech-insights-node@0.4.14 + - @backstage/plugin-todo-backend@0.3.6 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-events-node@0.2.17 + - @backstage/plugin-search-common@1.2.9 + +## 0.2.90-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-azure-devops-backend@0.5.0-next.3 + - @backstage/plugin-scaffolder-backend@1.19.2-next.3 + - @backstage/backend-common@0.20.0-next.3 + - example-app@0.2.90-next.4 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.9-next.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.25-next.3 + - @backstage/backend-tasks@0.5.13-next.3 + - @backstage/catalog-client@1.5.0-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0-next.1 + - @backstage/plugin-adr-backend@0.4.5-next.3 + - @backstage/plugin-app-backend@0.3.56-next.3 + - @backstage/plugin-auth-backend@0.20.1-next.3 + - @backstage/plugin-auth-node@0.4.2-next.3 + - @backstage/plugin-azure-sites-backend@0.1.18-next.3 + - @backstage/plugin-badges-backend@0.3.5-next.3 + - @backstage/plugin-catalog-backend@1.16.0-next.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.3 + - @backstage/plugin-catalog-node@1.6.0-next.3 + - @backstage/plugin-code-coverage-backend@0.2.22-next.3 + - @backstage/plugin-devtools-backend@0.2.5-next.3 + - @backstage/plugin-entity-feedback-backend@0.2.5-next.3 + - @backstage/plugin-events-backend@0.2.17-next.3 + - @backstage/plugin-events-node@0.2.17-next.3 + - @backstage/plugin-explore-backend@0.0.18-next.3 + - @backstage/plugin-jenkins-backend@0.3.2-next.3 + - @backstage/plugin-kafka-backend@0.3.6-next.3 + - @backstage/plugin-kubernetes-backend@0.14.0-next.3 + - @backstage/plugin-lighthouse-backend@0.4.0-next.3 + - @backstage/plugin-linguist-backend@0.5.5-next.3 + - @backstage/plugin-nomad-backend@0.1.10-next.3 + - @backstage/plugin-permission-backend@0.5.31-next.3 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-permission-node@0.7.19-next.3 + - @backstage/plugin-playlist-backend@0.3.12-next.3 + - @backstage/plugin-proxy-backend@0.4.6-next.3 + - @backstage/plugin-rollbar-backend@0.1.53-next.3 + - @backstage/plugin-search-backend@1.4.8-next.3 + - @backstage/plugin-search-backend-module-catalog@0.1.12-next.3 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.11-next.3 + - @backstage/plugin-search-backend-module-explore@0.1.12-next.3 + - @backstage/plugin-search-backend-module-pg@0.5.17-next.3 + - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.3 + - @backstage/plugin-search-backend-node@1.2.12-next.3 + - @backstage/plugin-search-common@1.2.8 + - @backstage/plugin-tech-insights-backend@0.5.22-next.3 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.40-next.3 + - @backstage/plugin-tech-insights-node@0.4.14-next.3 + - @backstage/plugin-techdocs-backend@1.9.1-next.3 + - @backstage/plugin-todo-backend@0.3.6-next.3 + +## 0.2.90-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.6.0-next.2 + - @backstage/plugin-catalog-backend@1.16.0-next.2 + - @backstage/plugin-auth-backend@0.20.1-next.2 + - @backstage/plugin-lighthouse-backend@0.4.0-next.2 + - @backstage/backend-common@0.20.0-next.2 + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/catalog-client@1.5.0-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.11-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.12-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.12-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.17-next.2 + - @backstage/plugin-events-backend@0.2.17-next.2 + - example-app@0.2.90-next.3 + - @backstage/backend-tasks@0.5.13-next.2 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/integration@1.8.0-next.1 + - @backstage/plugin-adr-backend@0.4.5-next.2 + - @backstage/plugin-app-backend@0.3.56-next.2 + - @backstage/plugin-azure-devops-backend@0.5.0-next.2 + - @backstage/plugin-azure-sites-backend@0.1.18-next.2 + - @backstage/plugin-badges-backend@0.3.5-next.2 + - @backstage/plugin-code-coverage-backend@0.2.22-next.2 + - @backstage/plugin-devtools-backend@0.2.5-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.5-next.2 + - @backstage/plugin-events-node@0.2.17-next.2 + - @backstage/plugin-explore-backend@0.0.18-next.2 + - @backstage/plugin-jenkins-backend@0.3.2-next.2 + - @backstage/plugin-kafka-backend@0.3.6-next.2 + - @backstage/plugin-kubernetes-backend@0.14.0-next.2 + - @backstage/plugin-linguist-backend@0.5.5-next.2 + - @backstage/plugin-nomad-backend@0.1.10-next.2 + - @backstage/plugin-permission-backend@0.5.31-next.2 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-permission-node@0.7.19-next.2 + - @backstage/plugin-playlist-backend@0.3.12-next.2 + - @backstage/plugin-proxy-backend@0.4.6-next.2 + - @backstage/plugin-rollbar-backend@0.1.53-next.2 + - @backstage/plugin-scaffolder-backend@1.19.2-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.9-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.25-next.2 + - @backstage/plugin-search-backend@1.4.8-next.2 + - @backstage/plugin-search-backend-node@1.2.12-next.2 + - @backstage/plugin-search-common@1.2.8 + - @backstage/plugin-tech-insights-backend@0.5.22-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.40-next.2 + - @backstage/plugin-tech-insights-node@0.4.14-next.2 + - @backstage/plugin-techdocs-backend@1.9.1-next.2 + - @backstage/plugin-todo-backend@0.3.6-next.2 + +## 0.2.90-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.20.1-next.1 + - @backstage/plugin-catalog-backend@1.15.1-next.1 + - @backstage/catalog-client@1.5.0-next.0 + - @backstage/plugin-azure-devops-backend@0.5.0-next.1 + - @backstage/plugin-kubernetes-backend@0.14.0-next.1 + - @backstage/integration@1.8.0-next.1 + - @backstage/plugin-azure-sites-backend@0.1.18-next.1 + - @backstage/backend-common@0.20.0-next.1 + - example-app@0.2.90-next.2 + - @backstage/backend-tasks@0.5.13-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-adr-backend@0.4.5-next.1 + - @backstage/plugin-app-backend@0.3.56-next.1 + - @backstage/plugin-auth-node@0.4.2-next.1 + - @backstage/plugin-badges-backend@0.3.5-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.1 + - @backstage/plugin-catalog-node@1.5.1-next.1 + - @backstage/plugin-code-coverage-backend@0.2.22-next.1 + - @backstage/plugin-devtools-backend@0.2.5-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.5-next.1 + - @backstage/plugin-events-backend@0.2.17-next.1 + - @backstage/plugin-events-node@0.2.17-next.1 + - @backstage/plugin-explore-backend@0.0.18-next.1 + - @backstage/plugin-jenkins-backend@0.3.2-next.1 + - @backstage/plugin-kafka-backend@0.3.6-next.1 + - @backstage/plugin-lighthouse-backend@0.3.5-next.1 + - @backstage/plugin-linguist-backend@0.5.5-next.1 + - @backstage/plugin-nomad-backend@0.1.10-next.1 + - @backstage/plugin-permission-backend@0.5.31-next.1 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-permission-node@0.7.19-next.1 + - @backstage/plugin-playlist-backend@0.3.12-next.1 + - @backstage/plugin-proxy-backend@0.4.6-next.1 + - @backstage/plugin-rollbar-backend@0.1.53-next.1 + - @backstage/plugin-scaffolder-backend@1.19.2-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.9-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.25-next.1 + - @backstage/plugin-search-backend@1.4.8-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.12-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.11-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.12-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.17-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.1 + - @backstage/plugin-search-backend-node@1.2.12-next.1 + - @backstage/plugin-search-common@1.2.8 + - @backstage/plugin-tech-insights-backend@0.5.22-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.40-next.1 + - @backstage/plugin-tech-insights-node@0.4.14-next.1 + - @backstage/plugin-techdocs-backend@1.9.1-next.1 + - @backstage/plugin-todo-backend@0.3.6-next.1 + +## 0.2.90-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.0 + - @backstage/plugin-auth-backend@0.20.1-next.0 + - @backstage/backend-tasks@0.5.13-next.0 + - @backstage/plugin-scaffolder-backend@1.19.2-next.0 + - @backstage/plugin-kubernetes-backend@0.14.0-next.0 + - @backstage/plugin-azure-sites-backend@0.1.18-next.0 + - @backstage/integration@1.8.0-next.0 + - example-app@0.2.90-next.0 + - @backstage/plugin-adr-backend@0.4.5-next.0 + - @backstage/plugin-app-backend@0.3.56-next.0 + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/plugin-azure-devops-backend@0.4.5-next.0 + - @backstage/plugin-badges-backend@0.3.5-next.0 + - @backstage/plugin-catalog-backend@1.15.1-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.0 + - @backstage/plugin-catalog-node@1.5.1-next.0 + - @backstage/plugin-code-coverage-backend@0.2.22-next.0 + - @backstage/plugin-devtools-backend@0.2.5-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.5-next.0 + - @backstage/plugin-events-backend@0.2.17-next.0 + - @backstage/plugin-explore-backend@0.0.18-next.0 + - @backstage/plugin-jenkins-backend@0.3.2-next.0 + - @backstage/plugin-kafka-backend@0.3.6-next.0 + - @backstage/plugin-lighthouse-backend@0.3.5-next.0 + - @backstage/plugin-linguist-backend@0.5.5-next.0 + - @backstage/plugin-nomad-backend@0.1.10-next.0 + - @backstage/plugin-permission-backend@0.5.31-next.0 + - @backstage/plugin-permission-node@0.7.19-next.0 + - @backstage/plugin-playlist-backend@0.3.12-next.0 + - @backstage/plugin-proxy-backend@0.4.6-next.0 + - @backstage/plugin-rollbar-backend@0.1.53-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.9-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.25-next.0 + - @backstage/plugin-search-backend@1.4.8-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.12-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.11-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.12-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.17-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.0 + - @backstage/plugin-search-backend-node@1.2.12-next.0 + - @backstage/plugin-tech-insights-backend@0.5.22-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.40-next.0 + - @backstage/plugin-tech-insights-node@0.4.14-next.0 + - @backstage/plugin-techdocs-backend@1.9.1-next.0 + - @backstage/plugin-todo-backend@0.3.6-next.0 + - @backstage/catalog-client@1.4.6 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.0 + - @backstage/plugin-events-node@0.2.17-next.0 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-search-common@1.2.8 + +## 0.2.89 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.15.0 + - @backstage/plugin-catalog-node@1.5.0 + - @backstage/plugin-search-backend-module-pg@0.5.16 + - @backstage/plugin-kubernetes-backend@0.13.1 + - @backstage/plugin-search-backend-node@1.2.11 + - @backstage/integration@1.7.2 + - @backstage/plugin-auth-backend@0.20.0 + - @backstage/backend-common@0.19.9 + - @backstage/plugin-techdocs-backend@1.9.0 + - @backstage/plugin-code-coverage-backend@0.2.21 + - @backstage/plugin-scaffolder-backend@1.19.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.10 + - @backstage/plugin-search-backend@1.4.7 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4 + - @backstage/plugin-entity-feedback-backend@0.2.4 + - @backstage/plugin-tech-insights-backend@0.5.21 + - @backstage/plugin-linguist-backend@0.5.4 + - @backstage/plugin-playlist-backend@0.3.11 + - @backstage/backend-tasks@0.5.12 + - @backstage/plugin-badges-backend@0.3.4 + - @backstage/plugin-app-backend@0.3.55 + - @backstage/plugin-search-backend-module-techdocs@0.1.11 + - @backstage/catalog-client@1.4.6 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-jenkins-backend@0.3.1 + - @backstage/plugin-adr-backend@0.4.4 + - @backstage/plugin-kafka-backend@0.3.5 + - @backstage/plugin-proxy-backend@0.4.5 + - example-app@0.2.89 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4 + - @backstage/plugin-lighthouse-backend@0.3.4 + - @backstage/plugin-search-backend-module-catalog@0.1.11 + - @backstage/plugin-todo-backend@0.3.5 + - @backstage/plugin-devtools-backend@0.2.4 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-auth-node@0.4.1 + - @backstage/plugin-azure-devops-backend@0.4.4 + - @backstage/plugin-azure-sites-backend@0.1.17 + - @backstage/plugin-events-backend@0.2.16 + - @backstage/plugin-events-node@0.2.16 + - @backstage/plugin-explore-backend@0.0.17 + - @backstage/plugin-graphql-backend@0.2.1 + - @backstage/plugin-nomad-backend@0.1.9 + - @backstage/plugin-permission-backend@0.5.30 + - @backstage/plugin-permission-node@0.7.18 + - @backstage/plugin-rollbar-backend@0.1.52 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.8 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.24 + - @backstage/plugin-search-backend-module-explore@0.1.11 + - @backstage/plugin-search-common@1.2.8 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.39 + - @backstage/plugin-tech-insights-node@0.4.13 + +## 0.2.89-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.13.1-next.2 + - @backstage/plugin-scaffolder-backend@1.19.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.10-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.16-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.4-next.2 + - @backstage/plugin-code-coverage-backend@0.2.21-next.2 + - @backstage/plugin-tech-insights-backend@0.5.21-next.2 + - @backstage/plugin-linguist-backend@0.5.4-next.2 + - @backstage/plugin-playlist-backend@0.3.11-next.2 + - @backstage/plugin-techdocs-backend@1.9.0-next.2 + - @backstage/backend-common@0.19.9-next.2 + - @backstage/plugin-catalog-backend@1.15.0-next.2 + - @backstage/backend-tasks@0.5.12-next.2 + - @backstage/plugin-badges-backend@0.3.4-next.2 + - @backstage/plugin-auth-backend@0.20.0-next.2 + - @backstage/plugin-app-backend@0.3.55-next.2 + - example-app@0.2.89-next.2 + - @backstage/plugin-adr-backend@0.4.4-next.2 + - @backstage/plugin-auth-node@0.4.1-next.2 + - @backstage/plugin-azure-devops-backend@0.4.4-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.2 + - @backstage/plugin-catalog-node@1.5.0-next.2 + - @backstage/plugin-devtools-backend@0.2.4-next.2 + - @backstage/plugin-events-backend@0.2.16-next.2 + - @backstage/plugin-events-node@0.2.16-next.2 + - @backstage/plugin-jenkins-backend@0.3.1-next.2 + - @backstage/plugin-kafka-backend@0.3.5-next.2 + - @backstage/plugin-lighthouse-backend@0.3.4-next.2 + - @backstage/plugin-nomad-backend@0.1.9-next.2 + - @backstage/plugin-permission-backend@0.5.30-next.2 + - @backstage/plugin-permission-node@0.7.18-next.2 + - @backstage/plugin-proxy-backend@0.4.5-next.2 + - @backstage/plugin-search-backend@1.4.7-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.11-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.11-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.2 + - @backstage/plugin-search-backend-node@1.2.11-next.2 + - @backstage/plugin-todo-backend@0.3.5-next.2 + - @backstage/plugin-rollbar-backend@0.1.52-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.8-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.24-next.2 + - @backstage/plugin-azure-sites-backend@0.1.17-next.2 + - @backstage/plugin-explore-backend@0.0.17-next.2 + - @backstage/plugin-graphql-backend@0.2.1-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.39-next.2 + - @backstage/plugin-tech-insights-node@0.4.13-next.2 + +## 0.2.89-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.15.0-next.1 + - @backstage/plugin-catalog-node@1.5.0-next.1 + - @backstage/integration@1.7.2-next.0 + - @backstage/plugin-auth-backend@0.20.0-next.1 + - @backstage/plugin-techdocs-backend@1.9.0-next.1 + - @backstage/plugin-scaffolder-backend@1.19.0-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.1 + - @backstage/plugin-jenkins-backend@0.3.1-next.1 + - @backstage/plugin-kubernetes-backend@0.13.1-next.1 + - @backstage/plugin-lighthouse-backend@0.3.4-next.1 + - @backstage/plugin-linguist-backend@0.5.4-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.11-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.1 + - @backstage/plugin-todo-backend@0.3.5-next.1 + - example-app@0.2.89-next.1 + - @backstage/backend-common@0.19.9-next.1 + - @backstage/plugin-adr-backend@0.4.4-next.1 + - @backstage/plugin-code-coverage-backend@0.2.21-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.8-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.24-next.1 + - @backstage/backend-tasks@0.5.12-next.1 + - @backstage/plugin-app-backend@0.3.55-next.1 + - @backstage/plugin-auth-node@0.4.1-next.1 + - @backstage/plugin-badges-backend@0.3.4-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.4-next.1 + - @backstage/plugin-events-backend@0.2.16-next.1 + - @backstage/plugin-permission-node@0.7.18-next.1 + - @backstage/plugin-playlist-backend@0.3.11-next.1 + - @backstage/plugin-proxy-backend@0.4.5-next.1 + - @backstage/plugin-rollbar-backend@0.1.52-next.1 + - @backstage/plugin-search-backend@1.4.7-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.11-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.16-next.1 + - @backstage/plugin-tech-insights-backend@0.5.21-next.1 + - @backstage/plugin-azure-devops-backend@0.4.4-next.1 + - @backstage/plugin-azure-sites-backend@0.1.17-next.1 + - @backstage/plugin-devtools-backend@0.2.4-next.1 + - @backstage/plugin-explore-backend@0.0.17-next.1 + - @backstage/plugin-graphql-backend@0.2.1-next.1 + - @backstage/plugin-kafka-backend@0.3.5-next.1 + - @backstage/plugin-nomad-backend@0.1.9-next.1 + - @backstage/plugin-permission-backend@0.5.30-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.10-next.1 + - @backstage/plugin-search-backend-node@1.2.11-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.39-next.1 + - @backstage/plugin-tech-insights-node@0.4.13-next.1 + - @backstage/catalog-client@1.4.5 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.1 + - @backstage/plugin-events-node@0.2.16-next.1 + - @backstage/plugin-permission-common@0.7.9 + - @backstage/plugin-search-common@1.2.7 + +## 0.2.89-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@1.2.11-next.0 + - @backstage/plugin-techdocs-backend@1.8.1-next.0 + - @backstage/plugin-code-coverage-backend@0.2.21-next.0 + - @backstage/plugin-scaffolder-backend@1.19.0-next.0 + - @backstage/plugin-catalog-backend@1.15.0-next.0 + - @backstage/plugin-search-backend@1.4.7-next.0 + - @backstage/plugin-tech-insights-backend@0.5.21-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.0 + - @backstage/plugin-kafka-backend@0.3.5-next.0 + - @backstage/plugin-proxy-backend@0.4.5-next.0 + - @backstage/plugin-auth-backend@0.20.0-next.0 + - @backstage/backend-common@0.19.9-next.0 + - @backstage/integration@1.7.1 + - @backstage/plugin-app-backend@0.3.55-next.0 + - @backstage/plugin-devtools-backend@0.2.4-next.0 + - example-app@0.2.89-next.0 + - @backstage/backend-tasks@0.5.12-next.0 + - @backstage/catalog-client@1.4.5 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-adr-backend@0.4.4-next.0 + - @backstage/plugin-auth-node@0.4.1-next.0 + - @backstage/plugin-azure-devops-backend@0.4.4-next.0 + - @backstage/plugin-azure-sites-backend@0.1.17-next.0 + - @backstage/plugin-badges-backend@0.3.4-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.0 + - @backstage/plugin-catalog-node@1.4.8-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.4-next.0 + - @backstage/plugin-events-backend@0.2.16-next.0 + - @backstage/plugin-events-node@0.2.16-next.0 + - @backstage/plugin-explore-backend@0.0.17-next.0 + - @backstage/plugin-graphql-backend@0.2.1-next.0 + - @backstage/plugin-jenkins-backend@0.3.1-next.0 + - @backstage/plugin-kubernetes-backend@0.13.1-next.0 + - @backstage/plugin-lighthouse-backend@0.3.4-next.0 + - @backstage/plugin-linguist-backend@0.5.4-next.0 + - @backstage/plugin-nomad-backend@0.1.9-next.0 + - @backstage/plugin-permission-backend@0.5.30-next.0 + - @backstage/plugin-permission-common@0.7.9 + - @backstage/plugin-permission-node@0.7.18-next.0 + - @backstage/plugin-playlist-backend@0.3.11-next.0 + - @backstage/plugin-rollbar-backend@0.1.52-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.8-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.24-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.11-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.10-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.11-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.16-next.0 + - @backstage/plugin-search-common@1.2.7 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.39-next.0 + - @backstage/plugin-tech-insights-node@0.4.13-next.0 + - @backstage/plugin-todo-backend@0.3.5-next.0 + +## 0.2.88 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-nomad-backend@0.1.8 + - @backstage/backend-tasks@0.5.11 + - @backstage/backend-common@0.19.8 + - @backstage/plugin-scaffolder-backend@1.18.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.9 + - @backstage/integration@1.7.1 + - @backstage/plugin-playlist-backend@0.3.10 + - @backstage/plugin-techdocs-backend@1.8.0 + - @backstage/plugin-auth-backend@0.19.3 + - @backstage/plugin-rollbar-backend@0.1.51 + - @backstage/plugin-catalog-backend@1.14.0 + - @backstage/plugin-catalog-node@1.4.7 + - @backstage/plugin-auth-node@0.4.0 + - @backstage/plugin-graphql-backend@0.2.0 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-badges-backend@0.3.3 + - @backstage/plugin-tech-insights-backend@0.5.20 + - @backstage/plugin-kubernetes-backend@0.13.0 + - @backstage/plugin-jenkins-backend@0.3.0 + - @backstage/plugin-code-coverage-backend@0.2.20 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.23 + - @backstage/plugin-search-backend@1.4.6 + - example-app@0.2.88 + - @backstage/plugin-lighthouse-backend@0.3.3 + - @backstage/plugin-linguist-backend@0.5.3 + - @backstage/plugin-search-backend-module-catalog@0.1.10 + - @backstage/plugin-search-backend-module-explore@0.1.10 + - @backstage/plugin-search-backend-module-techdocs@0.1.10 + - @backstage/plugin-search-backend-node@1.2.10 + - @backstage/plugin-tech-insights-node@0.4.12 + - @backstage/plugin-adr-backend@0.4.3 + - @backstage/plugin-app-backend@0.3.54 + - @backstage/plugin-azure-devops-backend@0.4.3 + - @backstage/plugin-azure-sites-backend@0.1.16 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.3 + - @backstage/plugin-devtools-backend@0.2.3 + - @backstage/plugin-entity-feedback-backend@0.2.3 + - @backstage/plugin-events-backend@0.2.15 + - @backstage/plugin-explore-backend@0.0.16 + - @backstage/plugin-kafka-backend@0.3.3 + - @backstage/plugin-permission-backend@0.5.29 + - @backstage/plugin-permission-node@0.7.17 + - @backstage/plugin-proxy-backend@0.4.3 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.7 + - @backstage/plugin-search-backend-module-pg@0.5.15 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.38 + - @backstage/plugin-todo-backend@0.3.4 + - @backstage/catalog-client@1.4.5 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.3 + - @backstage/plugin-events-node@0.2.15 + - @backstage/plugin-permission-common@0.7.9 + - @backstage/plugin-search-common@1.2.7 + +## 0.2.88-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-nomad-backend@0.1.8-next.2 + - @backstage/backend-common@0.19.8-next.2 + - @backstage/plugin-scaffolder-backend@1.18.0-next.2 + - @backstage/plugin-techdocs-backend@1.8.0-next.2 + - @backstage/plugin-auth-node@0.4.0-next.2 + - @backstage/plugin-catalog-backend@1.14.0-next.2 + - @backstage/catalog-model@1.4.3-next.0 + - @backstage/integration@1.7.1-next.1 + - @backstage/plugin-kubernetes-backend@0.12.3-next.2 + - @backstage/plugin-jenkins-backend@0.2.9-next.2 + - @backstage/plugin-auth-backend@0.19.3-next.2 + - @backstage/backend-tasks@0.5.11-next.2 + - @backstage/plugin-adr-backend@0.4.3-next.2 + - @backstage/plugin-app-backend@0.3.54-next.2 + - @backstage/plugin-azure-devops-backend@0.4.3-next.2 + - @backstage/plugin-azure-sites-backend@0.1.16-next.2 + - @backstage/plugin-badges-backend@0.3.3-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.3-next.2 + - @backstage/plugin-catalog-node@1.4.7-next.2 + - @backstage/plugin-code-coverage-backend@0.2.20-next.2 + - @backstage/plugin-devtools-backend@0.2.3-next.2 + - @backstage/plugin-entity-feedback-backend@0.2.3-next.2 + - @backstage/plugin-events-backend@0.2.15-next.2 + - @backstage/plugin-explore-backend@0.0.16-next.2 + - @backstage/plugin-graphql-backend@0.1.44-next.2 + - @backstage/plugin-kafka-backend@0.3.3-next.2 + - @backstage/plugin-lighthouse-backend@0.3.3-next.2 + - @backstage/plugin-linguist-backend@0.5.3-next.2 + - @backstage/plugin-permission-backend@0.5.29-next.2 + - @backstage/plugin-permission-node@0.7.17-next.2 + - @backstage/plugin-playlist-backend@0.3.10-next.2 + - @backstage/plugin-proxy-backend@0.4.3-next.2 + - @backstage/plugin-rollbar-backend@0.1.51-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.7-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.23-next.2 + - @backstage/plugin-search-backend@1.4.6-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.10-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.9-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.10-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.15-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.10-next.2 + - @backstage/plugin-search-backend-node@1.2.10-next.2 + - @backstage/plugin-tech-insights-backend@0.5.20-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.38-next.2 + - @backstage/plugin-tech-insights-node@0.4.12-next.2 + - @backstage/plugin-todo-backend@0.3.4-next.2 + - example-app@0.2.88-next.2 + - @backstage/catalog-client@1.4.5-next.0 + - @backstage/config@1.1.1-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.3-next.2 + - @backstage/plugin-events-node@0.2.15-next.2 + - @backstage/plugin-permission-common@0.7.9-next.0 + - @backstage/plugin-search-common@1.2.7-next.0 + +## 0.2.88-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.10-next.1 + - @backstage/plugin-catalog-backend@1.14.0-next.1 + - @backstage/plugin-catalog-node@1.4.6-next.1 + - @backstage/backend-common@0.19.7-next.1 + - @backstage/plugin-scaffolder-backend@1.18.0-next.1 + - @backstage/plugin-badges-backend@0.3.2-next.1 + - @backstage/plugin-lighthouse-backend@0.3.2-next.1 + - @backstage/plugin-linguist-backend@0.5.2-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.9-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.9-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.1 + - @backstage/plugin-search-backend-node@1.2.9-next.1 + - @backstage/plugin-tech-insights-backend@0.5.19-next.1 + - @backstage/plugin-tech-insights-node@0.4.11-next.1 + - example-app@0.2.88-next.1 + - @backstage/plugin-auth-backend@0.19.2-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.1 + - @backstage/plugin-kubernetes-backend@0.12.2-next.1 + - @backstage/plugin-todo-backend@0.3.3-next.1 + - @backstage/plugin-adr-backend@0.4.2-next.1 + - @backstage/plugin-app-backend@0.3.53-next.1 + - @backstage/plugin-auth-node@0.3.2-next.1 + - @backstage/plugin-azure-devops-backend@0.4.2-next.1 + - @backstage/plugin-azure-sites-backend@0.1.15-next.1 + - @backstage/plugin-code-coverage-backend@0.2.19-next.1 + - @backstage/plugin-devtools-backend@0.2.2-next.1 + - @backstage/plugin-entity-feedback-backend@0.2.2-next.1 + - @backstage/plugin-events-backend@0.2.14-next.1 + - @backstage/plugin-explore-backend@0.0.15-next.1 + - @backstage/plugin-graphql-backend@0.1.43-next.1 + - @backstage/plugin-jenkins-backend@0.2.8-next.1 + - @backstage/plugin-kafka-backend@0.3.2-next.1 + - @backstage/plugin-nomad-backend@0.1.7-next.1 + - @backstage/plugin-permission-backend@0.5.28-next.1 + - @backstage/plugin-permission-node@0.7.16-next.1 + - @backstage/plugin-playlist-backend@0.3.9-next.1 + - @backstage/plugin-proxy-backend@0.4.2-next.1 + - @backstage/plugin-rollbar-backend@0.1.50-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.6-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.22-next.1 + - @backstage/plugin-search-backend@1.4.5-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.8-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.14-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.37-next.1 + - @backstage/plugin-techdocs-backend@1.7.2-next.1 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.1 + - @backstage/plugin-events-node@0.2.14-next.1 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + +## 0.2.88-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-elasticsearch@1.3.8-next.0 + - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-playlist-backend@0.3.9-next.0 + - @backstage/plugin-rollbar-backend@0.1.50-next.0 + - @backstage/plugin-catalog-backend@1.14.0-next.0 + - @backstage/plugin-tech-insights-backend@0.5.19-next.0 + - @backstage/plugin-code-coverage-backend@0.2.19-next.0 + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.22-next.0 + - @backstage/backend-common@0.19.7-next.0 + - example-app@0.2.88-next.0 + - @backstage/plugin-adr-backend@0.4.2-next.0 + - @backstage/plugin-scaffolder-backend@1.17.3-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.6-next.0 + - @backstage/plugin-techdocs-backend@1.7.2-next.0 + - @backstage/plugin-todo-backend@0.3.3-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/plugin-app-backend@0.3.53-next.0 + - @backstage/plugin-auth-backend@0.19.2-next.0 + - @backstage/plugin-azure-devops-backend@0.4.2-next.0 + - @backstage/plugin-azure-sites-backend@0.1.15-next.0 + - @backstage/plugin-badges-backend@0.3.2-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.0 + - @backstage/plugin-catalog-node@1.4.6-next.0 + - @backstage/plugin-devtools-backend@0.2.2-next.0 + - @backstage/plugin-entity-feedback-backend@0.2.2-next.0 + - @backstage/plugin-events-backend@0.2.14-next.0 + - @backstage/plugin-events-node@0.2.14-next.0 + - @backstage/plugin-explore-backend@0.0.15-next.0 + - @backstage/plugin-graphql-backend@0.1.43-next.0 + - @backstage/plugin-jenkins-backend@0.2.8-next.0 + - @backstage/plugin-kafka-backend@0.3.2-next.0 + - @backstage/plugin-kubernetes-backend@0.12.2-next.0 + - @backstage/plugin-lighthouse-backend@0.3.2-next.0 + - @backstage/plugin-linguist-backend@0.5.2-next.0 + - @backstage/plugin-nomad-backend@0.1.7-next.0 + - @backstage/plugin-permission-backend@0.5.28-next.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-proxy-backend@0.4.2-next.0 + - @backstage/plugin-search-backend@1.4.5-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.9-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.9-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.14-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.37-next.0 + - @backstage/plugin-tech-insights-node@0.4.11-next.0 + +## 0.2.87 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-pg@0.5.12 + - @backstage/plugin-catalog-backend@1.13.0 + - @backstage/plugin-kubernetes-backend@0.12.0 + - @backstage/plugin-techdocs-backend@1.7.0 + - @backstage/plugin-auth-backend@0.19.0 + - @backstage/plugin-proxy-backend@0.4.0 + - @backstage/plugin-adr-backend@0.4.0 + - @backstage/plugin-azure-devops-backend@0.4.0 + - @backstage/plugin-badges-backend@0.3.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 + - @backstage/plugin-devtools-backend@0.2.0 + - @backstage/plugin-entity-feedback-backend@0.2.0 + - @backstage/plugin-kafka-backend@0.3.0 + - @backstage/plugin-lighthouse-backend@0.3.0 + - @backstage/plugin-linguist-backend@0.5.0 + - @backstage/plugin-todo-backend@0.3.0 + - @backstage/plugin-app-backend@0.3.51 + - @backstage/plugin-events-backend@0.2.12 + - @backstage/plugin-permission-backend@0.5.26 + - @backstage/plugin-scaffolder-backend@1.17.0 + - @backstage/plugin-search-backend@1.4.3 + - @backstage/plugin-search-backend-module-catalog@0.1.7 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.6 + - @backstage/plugin-search-backend-module-explore@0.1.7 + - @backstage/plugin-search-backend-module-techdocs@0.1.7 + - @backstage/plugin-code-coverage-backend@0.2.17 + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/integration@1.7.0 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 + - @backstage/plugin-tech-insights-backend@0.5.17 + - example-app@0.2.87 + - @backstage/plugin-catalog-node@1.4.4 + - @backstage/plugin-playlist-backend@0.3.7 + - @backstage/plugin-rollbar-backend@0.1.48 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4 + - @backstage/plugin-azure-sites-backend@0.1.13 + - @backstage/plugin-events-node@0.2.12 + - @backstage/plugin-explore-backend@0.0.13 + - @backstage/plugin-graphql-backend@0.1.41 + - @backstage/plugin-jenkins-backend@0.2.6 + - @backstage/plugin-nomad-backend@0.1.5 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.20 + - @backstage/plugin-search-backend-node@1.2.7 + - @backstage/plugin-tech-insights-node@0.4.9 + +## 0.2.87-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-backend@1.7.0-next.3 + - @backstage/plugin-proxy-backend@0.4.0-next.3 + - @backstage/plugin-adr-backend@0.4.0-next.3 + - @backstage/plugin-auth-backend@0.19.0-next.3 + - @backstage/plugin-azure-devops-backend@0.4.0-next.3 + - @backstage/plugin-badges-backend@0.3.0-next.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0-next.3 + - @backstage/plugin-devtools-backend@0.2.0-next.3 + - @backstage/plugin-entity-feedback-backend@0.2.0-next.3 + - @backstage/plugin-kafka-backend@0.3.0-next.3 + - @backstage/plugin-lighthouse-backend@0.3.0-next.3 + - @backstage/plugin-linguist-backend@0.5.0-next.3 + - @backstage/plugin-todo-backend@0.3.0-next.3 + - @backstage/plugin-app-backend@0.3.51-next.3 + - @backstage/plugin-catalog-backend@1.13.0-next.3 + - @backstage/plugin-events-backend@0.2.12-next.3 + - @backstage/plugin-kubernetes-backend@0.11.6-next.3 + - @backstage/plugin-permission-backend@0.5.26-next.3 + - @backstage/plugin-scaffolder-backend@1.17.0-next.3 + - @backstage/plugin-search-backend@1.4.3-next.3 + - @backstage/plugin-search-backend-module-catalog@0.1.7-next.3 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.6-next.3 + - @backstage/plugin-search-backend-module-explore@0.1.7-next.3 + - @backstage/plugin-search-backend-module-pg@0.5.12-next.3 + - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.3 + - @backstage/catalog-client@1.4.4-next.2 + - @backstage/catalog-model@1.4.2-next.2 + - @backstage/config@1.1.0-next.2 + - @backstage/integration@1.7.0-next.3 + - @backstage/plugin-permission-common@0.7.8-next.2 + - @backstage/plugin-search-common@1.2.6-next.2 + - @backstage/plugin-permission-node@0.7.14-next.3 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0-next.0 + - example-app@0.2.87-next.3 + - @backstage/backend-common@0.19.5-next.3 + - @backstage/plugin-explore-backend@0.0.13-next.3 + - @backstage/backend-tasks@0.5.8-next.3 + - @backstage/plugin-auth-node@0.3.0-next.3 + - @backstage/plugin-azure-sites-backend@0.1.13-next.3 + - @backstage/plugin-catalog-node@1.4.4-next.3 + - @backstage/plugin-code-coverage-backend@0.2.17-next.3 + - @backstage/plugin-events-node@0.2.12-next.3 + - @backstage/plugin-graphql-backend@0.1.41-next.3 + - @backstage/plugin-jenkins-backend@0.2.6-next.3 + - @backstage/plugin-nomad-backend@0.1.5-next.3 + - @backstage/plugin-playlist-backend@0.3.7-next.3 + - @backstage/plugin-rollbar-backend@0.1.48-next.3 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4-next.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.20-next.3 + - @backstage/plugin-search-backend-node@1.2.7-next.3 + - @backstage/plugin-tech-insights-backend@0.5.17-next.3 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35-next.3 + - @backstage/plugin-tech-insights-node@0.4.9-next.3 + +## 0.2.87-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.16.6-next.2 + - @backstage/plugin-code-coverage-backend@0.2.17-next.2 + - @backstage/plugin-permission-backend@0.5.26-next.2 + - @backstage/plugin-catalog-backend@1.13.0-next.2 + - @backstage/plugin-badges-backend@0.2.6-next.2 + - @backstage/config@1.1.0-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35-next.2 + - @backstage/plugin-tech-insights-backend@0.5.17-next.2 + - @backstage/backend-tasks@0.5.8-next.2 + - example-app@0.2.87-next.2 + - @backstage/backend-common@0.19.5-next.2 + - @backstage/plugin-app-backend@0.3.51-next.2 + - @backstage/plugin-auth-backend@0.18.9-next.2 + - @backstage/plugin-auth-node@0.3.0-next.2 + - @backstage/plugin-catalog-node@1.4.4-next.2 + - @backstage/plugin-entity-feedback-backend@0.1.9-next.2 + - @backstage/plugin-events-backend@0.2.12-next.2 + - @backstage/plugin-kubernetes-backend@0.11.6-next.2 + - @backstage/plugin-linguist-backend@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.14-next.2 + - @backstage/plugin-playlist-backend@0.3.7-next.2 + - @backstage/plugin-proxy-backend@0.3.3-next.2 + - @backstage/plugin-rollbar-backend@0.1.48-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4-next.2 + - @backstage/plugin-search-backend@1.4.3-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.7-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.7-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.12-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.2 + - @backstage/plugin-techdocs-backend@1.7.0-next.2 + - @backstage/integration@1.7.0-next.2 + - @backstage/plugin-devtools-backend@0.1.6-next.2 + - @backstage/catalog-model@1.4.2-next.1 + - @backstage/plugin-adr-backend@0.3.9-next.2 + - @backstage/plugin-azure-devops-backend@0.3.30-next.2 + - @backstage/plugin-azure-sites-backend@0.1.13-next.2 + - @backstage/plugin-explore-backend@0.0.13-next.2 + - @backstage/plugin-graphql-backend@0.1.41-next.2 + - @backstage/plugin-jenkins-backend@0.2.6-next.2 + - @backstage/plugin-kafka-backend@0.2.44-next.2 + - @backstage/plugin-lighthouse-backend@0.2.7-next.2 + - @backstage/plugin-nomad-backend@0.1.5-next.2 + - @backstage/plugin-permission-common@0.7.8-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.20-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.6-next.2 + - @backstage/plugin-search-backend-node@1.2.7-next.2 + - @backstage/plugin-tech-insights-node@0.4.9-next.2 + - @backstage/plugin-todo-backend@0.2.3-next.2 + - @backstage/catalog-client@1.4.4-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.3-next.2 + - @backstage/plugin-events-node@0.2.12-next.2 + - @backstage/plugin-search-common@1.2.6-next.1 + +## 0.2.87-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-pg@0.5.12-next.1 + - @backstage/plugin-kubernetes-backend@0.11.6-next.1 + - @backstage/plugin-catalog-backend@1.13.0-next.1 + - @backstage/plugin-auth-backend@0.18.9-next.1 + - @backstage/config@1.1.0-next.0 + - @backstage/integration@1.7.0-next.1 + - @backstage/plugin-devtools-backend@0.1.6-next.1 + - @backstage/backend-tasks@0.5.8-next.1 + - @backstage/plugin-techdocs-backend@1.7.0-next.1 + - @backstage/plugin-scaffolder-backend@1.16.6-next.1 + - @backstage/plugin-code-coverage-backend@0.2.17-next.1 + - example-app@0.2.87-next.1 + - @backstage/backend-common@0.19.5-next.1 + - @backstage/catalog-model@1.4.2-next.0 + - @backstage/plugin-adr-backend@0.3.9-next.1 + - @backstage/plugin-app-backend@0.3.51-next.1 + - @backstage/plugin-auth-node@0.3.0-next.1 + - @backstage/plugin-azure-devops-backend@0.3.30-next.1 + - @backstage/plugin-azure-sites-backend@0.1.13-next.1 + - @backstage/plugin-badges-backend@0.2.6-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.9-next.1 + - @backstage/plugin-events-backend@0.2.12-next.1 + - @backstage/plugin-explore-backend@0.0.13-next.1 + - @backstage/plugin-graphql-backend@0.1.41-next.1 + - @backstage/plugin-jenkins-backend@0.2.6-next.1 + - @backstage/plugin-kafka-backend@0.2.44-next.1 + - @backstage/plugin-lighthouse-backend@0.2.7-next.1 + - @backstage/plugin-linguist-backend@0.4.3-next.1 + - @backstage/plugin-nomad-backend@0.1.5-next.1 + - @backstage/plugin-permission-backend@0.5.26-next.1 + - @backstage/plugin-permission-common@0.7.8-next.0 + - @backstage/plugin-permission-node@0.7.14-next.1 + - @backstage/plugin-playlist-backend@0.3.7-next.1 + - @backstage/plugin-proxy-backend@0.3.3-next.1 + - @backstage/plugin-rollbar-backend@0.1.48-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.20-next.1 + - @backstage/plugin-search-backend@1.4.3-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.7-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.6-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.7-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.1 + - @backstage/plugin-search-backend-node@1.2.7-next.1 + - @backstage/plugin-tech-insights-backend@0.5.17-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35-next.1 + - @backstage/plugin-tech-insights-node@0.4.9-next.1 + - @backstage/plugin-todo-backend@0.2.3-next.1 + - @backstage/plugin-catalog-node@1.4.4-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.3-next.1 + - @backstage/plugin-events-node@0.2.12-next.1 + - @backstage/catalog-client@1.4.4-next.0 + - @backstage/plugin-search-common@1.2.6-next.0 + +## 0.2.87-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.12.2-next.0 + - @backstage/plugin-auth-backend@0.18.8-next.0 + - @backstage/plugin-code-coverage-backend@0.2.16-next.0 + - @backstage/plugin-scaffolder-backend@1.16.3-next.0 + - @backstage/plugin-auth-node@0.3.0-next.0 + - @backstage/backend-common@0.19.4-next.0 + - @backstage/plugin-linguist-backend@0.4.2-next.0 + - @backstage/integration@1.7.0-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.8-next.0 + - @backstage/plugin-tech-insights-backend@0.5.16-next.0 + - @backstage/backend-tasks@0.5.7-next.0 + - @backstage/plugin-app-backend@0.3.50-next.0 + - example-app@0.2.87-next.0 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-adr-backend@0.3.8-next.0 + - @backstage/plugin-azure-devops-backend@0.3.29-next.0 + - @backstage/plugin-azure-sites-backend@0.1.12-next.0 + - @backstage/plugin-badges-backend@0.2.5-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.2-next.0 + - @backstage/plugin-catalog-node@1.4.3-next.0 + - @backstage/plugin-devtools-backend@0.1.5-next.0 + - @backstage/plugin-events-backend@0.2.11-next.0 + - @backstage/plugin-events-node@0.2.11-next.0 + - @backstage/plugin-explore-backend@0.0.12-next.0 + - @backstage/plugin-graphql-backend@0.1.40-next.0 + - @backstage/plugin-jenkins-backend@0.2.5-next.0 + - @backstage/plugin-kafka-backend@0.2.43-next.0 + - @backstage/plugin-kubernetes-backend@0.11.5-next.0 + - @backstage/plugin-lighthouse-backend@0.2.6-next.0 + - @backstage/plugin-nomad-backend@0.1.4-next.0 + - @backstage/plugin-permission-backend@0.5.25-next.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-node@0.7.13-next.0 + - @backstage/plugin-playlist-backend@0.3.6-next.0 + - @backstage/plugin-proxy-backend@0.3.2-next.0 + - @backstage/plugin-rollbar-backend@0.1.47-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.3-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.19-next.0 + - @backstage/plugin-search-backend@1.4.2-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.5-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.11-next.0 + - @backstage/plugin-search-backend-node@1.2.6-next.0 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.34-next.0 + - @backstage/plugin-tech-insights-node@0.4.8-next.0 + - @backstage/plugin-techdocs-backend@1.6.7-next.0 + - @backstage/plugin-todo-backend@0.2.2-next.0 + +## 0.2.86 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-elasticsearch@1.3.3 + - @backstage/plugin-search-backend-module-pg@0.5.9 + - @backstage/plugin-azure-devops-backend@0.3.27 + - @backstage/plugin-kubernetes-backend@0.11.3 + - @backstage/plugin-lighthouse-backend@0.2.4 + - @backstage/plugin-permission-backend@0.5.23 + - @backstage/plugin-scaffolder-backend@1.16.0 + - @backstage/plugin-devtools-backend@0.1.3 + - @backstage/plugin-techdocs-backend@1.6.5 + - @backstage/backend-common@0.19.2 + - @backstage/plugin-catalog-backend@1.12.0 + - @backstage/plugin-badges-backend@0.2.3 + - @backstage/plugin-events-backend@0.2.9 + - @backstage/plugin-search-backend@1.4.0 + - @backstage/plugin-kafka-backend@0.2.41 + - @backstage/plugin-proxy-backend@0.3.0 + - @backstage/plugin-todo-backend@0.2.0 + - @backstage/plugin-app-backend@0.3.48 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.1 + - @backstage/plugin-auth-backend@0.18.6 + - @backstage/plugin-explore-backend@0.0.10 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.17 + - @backstage/plugin-entity-feedback-backend@0.1.6 + - @backstage/plugin-code-coverage-backend@0.2.14 + - @backstage/plugin-search-backend-node@1.2.4 + - @backstage/plugin-linguist-backend@0.4.0 + - @backstage/plugin-playlist-backend@0.3.4 + - @backstage/plugin-jenkins-backend@0.2.3 + - @backstage/plugin-nomad-backend@0.1.2 + - @backstage/plugin-catalog-node@1.4.1 + - @backstage/plugin-events-node@0.2.9 + - @backstage/plugin-auth-node@0.2.17 + - @backstage/integration@1.6.0 + - @backstage/backend-tasks@0.5.5 + - example-app@0.2.86 + - @backstage/plugin-adr-backend@0.3.6 + - @backstage/plugin-azure-sites-backend@0.1.10 + - @backstage/plugin-graphql-backend@0.1.38 + - @backstage/plugin-permission-node@0.7.11 + - @backstage/plugin-rollbar-backend@0.1.45 + - @backstage/plugin-tech-insights-backend@0.5.14 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.32 + - @backstage/plugin-tech-insights-node@0.4.6 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + +## 0.2.86-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.18.6-next.2 + - @backstage/plugin-scaffolder-backend@1.15.2-next.2 + - @backstage/plugin-explore-backend@0.0.10-next.2 + - @backstage/plugin-catalog-backend@1.12.0-next.2 + - @backstage/plugin-proxy-backend@0.3.0-next.2 + - @backstage/backend-tasks@0.5.5-next.2 + - @backstage/plugin-app-backend@0.3.48-next.2 + - @backstage/plugin-linguist-backend@0.4.0-next.2 + - @backstage/plugin-techdocs-backend@1.6.5-next.2 + - @backstage/backend-common@0.19.2-next.2 + - example-app@0.2.86-next.2 + - @backstage/plugin-adr-backend@0.3.6-next.2 + - @backstage/plugin-azure-devops-backend@0.3.27-next.2 + - @backstage/plugin-badges-backend@0.2.3-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.2 + - @backstage/plugin-catalog-node@1.4.1-next.2 + - @backstage/plugin-devtools-backend@0.1.3-next.2 + - @backstage/plugin-entity-feedback-backend@0.1.6-next.2 + - @backstage/plugin-events-backend@0.2.9-next.2 + - @backstage/plugin-events-node@0.2.9-next.2 + - @backstage/plugin-kafka-backend@0.2.41-next.2 + - @backstage/plugin-kubernetes-backend@0.11.3-next.2 + - @backstage/plugin-lighthouse-backend@0.2.4-next.2 + - @backstage/plugin-permission-backend@0.5.23-next.2 + - @backstage/plugin-permission-node@0.7.11-next.2 + - @backstage/plugin-search-backend@1.4.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.3-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.9-next.2 + - @backstage/plugin-search-backend-node@1.2.4-next.2 + - @backstage/plugin-todo-backend@0.2.0-next.2 + - @backstage/plugin-tech-insights-backend@0.5.14-next.2 + - @backstage/plugin-tech-insights-node@0.4.6-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.1-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.17-next.2 + - @backstage/plugin-auth-node@0.2.17-next.2 + - @backstage/plugin-azure-sites-backend@0.1.10-next.2 + - @backstage/plugin-code-coverage-backend@0.2.14-next.2 + - @backstage/plugin-graphql-backend@0.1.38-next.2 + - @backstage/plugin-jenkins-backend@0.2.3-next.2 + - @backstage/plugin-nomad-backend@0.1.2-next.2 + - @backstage/plugin-playlist-backend@0.3.4-next.2 + - @backstage/plugin-rollbar-backend@0.1.45-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.32-next.2 + +## 0.2.86-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-elasticsearch@1.3.3-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.9-next.1 + - @backstage/plugin-azure-devops-backend@0.3.27-next.1 + - @backstage/plugin-kubernetes-backend@0.11.3-next.1 + - @backstage/plugin-lighthouse-backend@0.2.4-next.1 + - @backstage/plugin-permission-backend@0.5.23-next.1 + - @backstage/plugin-scaffolder-backend@1.15.2-next.1 + - @backstage/plugin-devtools-backend@0.1.3-next.1 + - @backstage/plugin-techdocs-backend@1.6.5-next.1 + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-badges-backend@0.2.3-next.1 + - @backstage/plugin-events-backend@0.2.9-next.1 + - @backstage/plugin-search-backend@1.4.0-next.1 + - @backstage/plugin-kafka-backend@0.2.41-next.1 + - @backstage/plugin-proxy-backend@0.2.42-next.1 + - @backstage/plugin-todo-backend@0.2.0-next.1 + - @backstage/plugin-app-backend@0.3.48-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.1-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.17-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.6-next.1 + - @backstage/plugin-code-coverage-backend@0.2.14-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/plugin-linguist-backend@0.3.2-next.1 + - @backstage/plugin-playlist-backend@0.3.4-next.1 + - @backstage/plugin-explore-backend@0.0.10-next.1 + - @backstage/plugin-jenkins-backend@0.2.3-next.1 + - @backstage/plugin-nomad-backend@0.1.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/plugin-auth-backend@0.18.6-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-adr-backend@0.3.6-next.1 + - @backstage/plugin-azure-sites-backend@0.1.10-next.1 + - @backstage/plugin-graphql-backend@0.1.38-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/plugin-rollbar-backend@0.1.45-next.1 + - @backstage/plugin-tech-insights-backend@0.5.14-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.32-next.1 + - @backstage/plugin-tech-insights-node@0.4.6-next.1 + - example-app@0.2.86-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + +## 0.2.86-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-linguist-backend@0.3.2-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.0 + - @backstage/plugin-search-backend-node@1.2.4-next.0 + - @backstage/plugin-todo-backend@0.2.0-next.0 + - @backstage/plugin-catalog-backend@1.12.0-next.0 + - @backstage/plugin-search-backend@1.4.0-next.0 + - example-app@0.2.86-next.0 + - @backstage/backend-common@0.19.2-next.0 + - @backstage/backend-tasks@0.5.5-next.0 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/integration@1.5.1 + - @backstage/plugin-adr-backend@0.3.6-next.0 + - @backstage/plugin-app-backend@0.3.48-next.0 + - @backstage/plugin-auth-backend@0.18.6-next.0 + - @backstage/plugin-auth-node@0.2.17-next.0 + - @backstage/plugin-azure-devops-backend@0.3.27-next.0 + - @backstage/plugin-azure-sites-backend@0.1.10-next.0 + - @backstage/plugin-badges-backend@0.2.3-next.0 + - @backstage/plugin-catalog-node@1.4.1-next.0 + - @backstage/plugin-code-coverage-backend@0.2.14-next.0 + - @backstage/plugin-devtools-backend@0.1.3-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.6-next.0 + - @backstage/plugin-events-backend@0.2.9-next.0 + - @backstage/plugin-events-node@0.2.9-next.0 + - @backstage/plugin-explore-backend@0.0.10-next.0 + - @backstage/plugin-graphql-backend@0.1.38-next.0 + - @backstage/plugin-jenkins-backend@0.2.3-next.0 + - @backstage/plugin-kafka-backend@0.2.41-next.0 + - @backstage/plugin-kubernetes-backend@0.11.3-next.0 + - @backstage/plugin-lighthouse-backend@0.2.4-next.0 + - @backstage/plugin-nomad-backend@0.1.2-next.0 + - @backstage/plugin-permission-backend@0.5.23-next.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-node@0.7.11-next.0 + - @backstage/plugin-playlist-backend@0.3.4-next.0 + - @backstage/plugin-proxy-backend@0.2.42-next.0 + - @backstage/plugin-rollbar-backend@0.1.45-next.0 + - @backstage/plugin-scaffolder-backend@1.15.2-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.1-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.17-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.3-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.9-next.0 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-tech-insights-backend@0.5.14-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.32-next.0 + - @backstage/plugin-tech-insights-node@0.4.6-next.0 + - @backstage/plugin-techdocs-backend@1.6.5-next.0 + +## 0.2.85 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.11.2 + - @backstage/plugin-badges-backend@0.2.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.0 + - @backstage/plugin-devtools-backend@0.1.2 + - @backstage/plugin-tech-insights-backend@0.5.13 + - @backstage/backend-common@0.19.1 + - @backstage/plugin-scaffolder-backend@1.15.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1 + - @backstage/plugin-azure-devops-backend@0.3.26 + - @backstage/plugin-linguist-backend@0.3.1 + - @backstage/plugin-adr-backend@0.3.5 + - @backstage/plugin-lighthouse-backend@0.2.3 + - @backstage/plugin-entity-feedback-backend@0.1.5 + - @backstage/plugin-catalog-backend@1.11.0 + - @backstage/plugin-catalog-node@1.4.0 + - @backstage/plugin-auth-backend@0.18.5 + - example-app@0.2.85 + - @backstage/backend-tasks@0.5.4 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/integration@1.5.1 + - @backstage/plugin-app-backend@0.3.47 + - @backstage/plugin-auth-node@0.2.16 + - @backstage/plugin-azure-sites-backend@0.1.9 + - @backstage/plugin-code-coverage-backend@0.2.13 + - @backstage/plugin-events-backend@0.2.8 + - @backstage/plugin-events-node@0.2.8 + - @backstage/plugin-explore-backend@0.0.9 + - @backstage/plugin-graphql-backend@0.1.37 + - @backstage/plugin-jenkins-backend@0.2.2 + - @backstage/plugin-kafka-backend@0.2.40 + - @backstage/plugin-nomad-backend@0.1.1 + - @backstage/plugin-permission-backend@0.5.22 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-node@0.7.10 + - @backstage/plugin-playlist-backend@0.3.3 + - @backstage/plugin-proxy-backend@0.2.41 + - @backstage/plugin-rollbar-backend@0.1.44 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.16 + - @backstage/plugin-search-backend@1.3.3 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.2 + - @backstage/plugin-search-backend-module-pg@0.5.8 + - @backstage/plugin-search-backend-node@1.2.3 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.31 + - @backstage/plugin-tech-insights-node@0.4.5 + - @backstage/plugin-techdocs-backend@1.6.4 + - @backstage/plugin-todo-backend@0.1.44 + +## 0.2.85-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.0-next.1 + - @backstage/plugin-devtools-backend@0.1.2-next.2 + - @backstage/plugin-tech-insights-backend@0.5.13-next.1 + - @backstage/plugin-scaffolder-backend@1.15.1-next.1 + - @backstage/plugin-kubernetes-backend@0.11.2-next.2 + - @backstage/plugin-adr-backend@0.3.5-next.1 + - example-app@0.2.85-next.2 + - @backstage/backend-common@0.19.1-next.0 + - @backstage/backend-tasks@0.5.4-next.0 + - @backstage/catalog-client@1.4.3-next.0 + - @backstage/catalog-model@1.4.1-next.0 + - @backstage/config@1.0.8 + - @backstage/integration@1.5.1-next.0 + - @backstage/plugin-app-backend@0.3.47-next.0 + - @backstage/plugin-auth-backend@0.18.5-next.1 + - @backstage/plugin-auth-node@0.2.16-next.0 + - @backstage/plugin-azure-devops-backend@0.3.26-next.1 + - @backstage/plugin-azure-sites-backend@0.1.9-next.0 + - @backstage/plugin-badges-backend@0.2.2-next.1 + - @backstage/plugin-catalog-backend@1.11.0-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1-next.0 + - @backstage/plugin-catalog-node@1.4.0-next.0 + - @backstage/plugin-code-coverage-backend@0.2.13-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.5-next.0 + - @backstage/plugin-events-backend@0.2.8-next.0 + - @backstage/plugin-events-node@0.2.8-next.0 + - @backstage/plugin-explore-backend@0.0.9-next.0 + - @backstage/plugin-graphql-backend@0.1.37-next.0 + - @backstage/plugin-jenkins-backend@0.2.2-next.0 + - @backstage/plugin-kafka-backend@0.2.40-next.0 + - @backstage/plugin-lighthouse-backend@0.2.3-next.0 + - @backstage/plugin-linguist-backend@0.3.1-next.1 + - @backstage/plugin-nomad-backend@0.1.1-next.0 + - @backstage/plugin-permission-backend@0.5.22-next.0 + - @backstage/plugin-permission-common@0.7.7-next.0 + - @backstage/plugin-permission-node@0.7.10-next.0 + - @backstage/plugin-playlist-backend@0.3.3-next.0 + - @backstage/plugin-proxy-backend@0.2.41-next.0 + - @backstage/plugin-rollbar-backend@0.1.44-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.16-next.1 + - @backstage/plugin-search-backend@1.3.3-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.2-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.8-next.0 + - @backstage/plugin-search-backend-node@1.2.3-next.0 + - @backstage/plugin-search-common@1.2.5-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.31-next.0 + - @backstage/plugin-tech-insights-node@0.4.5-next.0 + - @backstage/plugin-techdocs-backend@1.6.4-next.0 + - @backstage/plugin-todo-backend@0.1.44-next.0 + +## 0.2.85-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.11.2-next.1 + - @backstage/plugin-badges-backend@0.2.2-next.1 + - @backstage/plugin-azure-devops-backend@0.3.26-next.1 + - @backstage/plugin-devtools-backend@0.1.2-next.1 + - @backstage/plugin-linguist-backend@0.3.1-next.1 + - @backstage/plugin-auth-backend@0.18.5-next.1 + - example-app@0.2.85-next.1 + - @backstage/config@1.0.8 + +## 0.2.85-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.1-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.5-next.0 + - @backstage/plugin-catalog-backend@1.11.0-next.0 + - @backstage/plugin-catalog-node@1.4.0-next.0 + - @backstage/plugin-kubernetes-backend@0.11.2-next.0 + - example-app@0.2.85-next.0 + - @backstage/backend-tasks@0.5.4-next.0 + - @backstage/catalog-client@1.4.3-next.0 + - @backstage/catalog-model@1.4.1-next.0 + - @backstage/config@1.0.8 + - @backstage/integration@1.5.1-next.0 + - @backstage/plugin-adr-backend@0.3.5-next.0 + - @backstage/plugin-app-backend@0.3.47-next.0 + - @backstage/plugin-auth-backend@0.18.5-next.0 + - @backstage/plugin-auth-node@0.2.16-next.0 + - @backstage/plugin-azure-devops-backend@0.3.26-next.0 + - @backstage/plugin-azure-sites-backend@0.1.9-next.0 + - @backstage/plugin-badges-backend@0.2.2-next.0 + - @backstage/plugin-code-coverage-backend@0.2.13-next.0 + - @backstage/plugin-devtools-backend@0.1.2-next.0 + - @backstage/plugin-events-backend@0.2.8-next.0 + - @backstage/plugin-events-node@0.2.8-next.0 + - @backstage/plugin-explore-backend@0.0.9-next.0 + - @backstage/plugin-graphql-backend@0.1.37-next.0 + - @backstage/plugin-jenkins-backend@0.2.2-next.0 + - @backstage/plugin-kafka-backend@0.2.40-next.0 + - @backstage/plugin-lighthouse-backend@0.2.3-next.0 + - @backstage/plugin-linguist-backend@0.3.1-next.0 + - @backstage/plugin-nomad-backend@0.1.1-next.0 + - @backstage/plugin-permission-backend@0.5.22-next.0 + - @backstage/plugin-permission-common@0.7.7-next.0 + - @backstage/plugin-permission-node@0.7.10-next.0 + - @backstage/plugin-playlist-backend@0.3.3-next.0 + - @backstage/plugin-proxy-backend@0.2.41-next.0 + - @backstage/plugin-rollbar-backend@0.1.44-next.0 + - @backstage/plugin-scaffolder-backend@1.15.1-next.0 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.4-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.16-next.0 + - @backstage/plugin-search-backend@1.3.3-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.2-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.8-next.0 + - @backstage/plugin-search-backend-node@1.2.3-next.0 + - @backstage/plugin-search-common@1.2.5-next.0 + - @backstage/plugin-tech-insights-backend@0.5.13-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.31-next.0 + - @backstage/plugin-tech-insights-node@0.4.5-next.0 + - @backstage/plugin-techdocs-backend@1.6.4-next.0 + - @backstage/plugin-todo-backend@0.1.44-next.0 + +## 0.2.84 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0 + - @backstage/catalog-client@1.4.2 + - @backstage/plugin-jenkins-backend@0.2.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.3 + - @backstage/plugin-devtools-backend@0.1.1 + - @backstage/plugin-scaffolder-backend@1.15.0 + - @backstage/plugin-nomad-backend@0.1.0 + - @backstage/plugin-azure-sites-backend@0.1.8 + - @backstage/plugin-kubernetes-backend@0.11.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0 + - @backstage/plugin-badges-backend@0.2.1 + - @backstage/plugin-catalog-backend@1.10.0 + - @backstage/integration@1.5.0 + - @backstage/plugin-search-backend@1.3.2 + - @backstage/plugin-explore-backend@0.0.8 + - @backstage/catalog-model@1.4.0 + - @backstage/plugin-auth-backend@0.18.4 + - @backstage/plugin-adr-backend@0.3.4 + - @backstage/plugin-code-coverage-backend@0.2.12 + - @backstage/plugin-proxy-backend@0.2.40 + - @backstage/plugin-linguist-backend@0.3.0 + - @backstage/plugin-search-backend-module-pg@0.5.7 + - example-app@0.2.84 + - @backstage/backend-tasks@0.5.3 + - @backstage/plugin-app-backend@0.3.46 + - @backstage/plugin-auth-node@0.2.15 + - @backstage/plugin-azure-devops-backend@0.3.25 + - @backstage/plugin-catalog-node@1.3.7 + - @backstage/plugin-entity-feedback-backend@0.1.4 + - @backstage/plugin-events-backend@0.2.7 + - @backstage/plugin-graphql-backend@0.1.36 + - @backstage/plugin-kafka-backend@0.2.39 + - @backstage/plugin-lighthouse-backend@0.2.2 + - @backstage/plugin-permission-backend@0.5.21 + - @backstage/plugin-permission-node@0.7.9 + - @backstage/plugin-playlist-backend@0.3.2 + - @backstage/plugin-rollbar-backend@0.1.43 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.15 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.1 + - @backstage/plugin-search-backend-node@1.2.2 + - @backstage/plugin-tech-insights-backend@0.5.12 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.30 + - @backstage/plugin-tech-insights-node@0.4.4 + - @backstage/plugin-techdocs-backend@1.6.3 + - @backstage/plugin-todo-backend@0.1.43 + - @backstage/config@1.0.8 + - @backstage/plugin-events-node@0.2.7 + - @backstage/plugin-permission-common@0.7.6 + - @backstage/plugin-search-common@1.2.4 + +## 0.2.84-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.15.0-next.3 + - @backstage/plugin-kubernetes-backend@0.11.1-next.3 + - @backstage/backend-common@0.19.0-next.2 + - @backstage/catalog-model@1.4.0-next.1 + - @backstage/plugin-catalog-backend@1.10.0-next.2 + - example-app@0.2.84-next.3 + - @backstage/backend-tasks@0.5.3-next.2 + - @backstage/catalog-client@1.4.2-next.2 + - @backstage/config@1.0.7 + - @backstage/integration@1.5.0-next.0 + - @backstage/plugin-adr-backend@0.3.4-next.2 + - @backstage/plugin-app-backend@0.3.46-next.2 + - @backstage/plugin-auth-backend@0.18.4-next.3 + - @backstage/plugin-auth-node@0.2.15-next.2 + - @backstage/plugin-azure-devops-backend@0.3.25-next.2 + - @backstage/plugin-azure-sites-backend@0.1.8-next.2 + - @backstage/plugin-badges-backend@0.2.1-next.3 + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.2 + - @backstage/plugin-code-coverage-backend@0.2.12-next.3 + - @backstage/plugin-devtools-backend@0.1.1-next.2 + - @backstage/plugin-entity-feedback-backend@0.1.4-next.2 + - @backstage/plugin-events-backend@0.2.7-next.2 + - @backstage/plugin-events-node@0.2.7-next.2 + - @backstage/plugin-explore-backend@0.0.8-next.2 + - @backstage/plugin-graphql-backend@0.1.36-next.2 + - @backstage/plugin-jenkins-backend@0.2.1-next.2 + - @backstage/plugin-kafka-backend@0.2.39-next.2 + - @backstage/plugin-lighthouse-backend@0.2.2-next.2 + - @backstage/plugin-linguist-backend@0.3.0-next.2 + - @backstage/plugin-permission-backend@0.5.21-next.2 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-permission-node@0.7.9-next.2 + - @backstage/plugin-playlist-backend@0.3.2-next.2 + - @backstage/plugin-proxy-backend@0.2.40-next.2 + - @backstage/plugin-rollbar-backend@0.1.43-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.3-next.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.15-next.3 + - @backstage/plugin-search-backend@1.3.2-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.1-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.7-next.2 + - @backstage/plugin-search-backend-node@1.2.2-next.2 + - @backstage/plugin-search-common@1.2.4-next.0 + - @backstage/plugin-tech-insights-backend@0.5.12-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.30-next.2 + - @backstage/plugin-tech-insights-node@0.4.4-next.2 + - @backstage/plugin-techdocs-backend@1.6.3-next.2 + - @backstage/plugin-todo-backend@0.1.43-next.2 + +## 0.2.84-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.11.1-next.2 + - @backstage/plugin-badges-backend@0.2.1-next.2 + - @backstage/plugin-scaffolder-backend@1.15.0-next.2 + - @backstage/plugin-auth-backend@0.18.4-next.2 + - @backstage/plugin-code-coverage-backend@0.2.12-next.2 + - example-app@0.2.84-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.3-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.15-next.2 + - @backstage/config@1.0.7 + +## 0.2.84-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/plugin-jenkins-backend@0.2.1-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.3-next.1 + - @backstage/plugin-devtools-backend@0.1.1-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.0 + - @backstage/plugin-catalog-backend@1.9.2-next.1 + - @backstage/integration@1.5.0-next.0 + - @backstage/plugin-adr-backend@0.3.4-next.1 + - @backstage/plugin-proxy-backend@0.2.40-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.7-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/plugin-scaffolder-backend@1.15.0-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-app-backend@0.3.46-next.1 + - @backstage/plugin-auth-backend@0.18.4-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-azure-devops-backend@0.3.25-next.1 + - @backstage/plugin-azure-sites-backend@0.1.8-next.1 + - @backstage/plugin-badges-backend@0.2.1-next.1 + - @backstage/plugin-catalog-node@1.3.7-next.1 + - @backstage/plugin-code-coverage-backend@0.2.12-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.4-next.1 + - @backstage/plugin-events-backend@0.2.7-next.1 + - @backstage/plugin-explore-backend@0.0.8-next.1 + - @backstage/plugin-graphql-backend@0.1.36-next.1 + - @backstage/plugin-kafka-backend@0.2.39-next.1 + - @backstage/plugin-kubernetes-backend@0.11.1-next.1 + - @backstage/plugin-lighthouse-backend@0.2.2-next.1 + - @backstage/plugin-linguist-backend@0.3.0-next.1 + - @backstage/plugin-permission-backend@0.5.21-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-playlist-backend@0.3.2-next.1 + - @backstage/plugin-rollbar-backend@0.1.43-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.15-next.1 + - @backstage/plugin-search-backend@1.3.2-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.1-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/plugin-tech-insights-backend@0.5.12-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.30-next.1 + - @backstage/plugin-tech-insights-node@0.4.4-next.1 + - @backstage/plugin-techdocs-backend@1.6.3-next.1 + - @backstage/plugin-todo-backend@0.1.43-next.1 + - example-app@0.2.84-next.1 + - @backstage/catalog-client@1.4.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-events-node@0.2.7-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.4-next.0 + +## 0.2.84-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.2-next.0 + - @backstage/plugin-scaffolder-backend@1.14.1-next.0 + - @backstage/plugin-jenkins-backend@0.2.1-next.0 + - @backstage/plugin-linguist-backend@0.3.0-next.0 + - @backstage/plugin-devtools-backend@0.1.1-next.0 + - @backstage/plugin-adr-backend@0.3.4-next.0 + - @backstage/plugin-auth-backend@0.18.4-next.0 + - @backstage/plugin-badges-backend@0.2.1-next.0 + - @backstage/plugin-catalog-backend@1.9.2-next.0 + - @backstage/plugin-catalog-node@1.3.7-next.0 + - @backstage/plugin-code-coverage-backend@0.2.12-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.4-next.0 + - @backstage/plugin-kubernetes-backend@0.11.1-next.0 + - @backstage/plugin-lighthouse-backend@0.2.2-next.0 + - @backstage/plugin-playlist-backend@0.3.2-next.0 + - @backstage/plugin-tech-insights-backend@0.5.12-next.0 + - @backstage/plugin-techdocs-backend@1.6.3-next.0 + - @backstage/plugin-todo-backend@0.1.43-next.0 + - example-app@0.2.84-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.15-next.0 + - @backstage/backend-common@0.18.6-next.0 + - @backstage/integration@1.4.5 + - @backstage/plugin-app-backend@0.3.46-next.0 + - @backstage/plugin-explore-backend@0.0.8-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-tasks@0.5.3-next.0 + - @backstage/catalog-model@1.3.0 + - @backstage/plugin-auth-node@0.2.15-next.0 + - @backstage/plugin-azure-devops-backend@0.3.25-next.0 + - @backstage/plugin-azure-sites-backend@0.1.8-next.0 + - @backstage/plugin-events-backend@0.2.7-next.0 + - @backstage/plugin-events-node@0.2.7-next.0 + - @backstage/plugin-graphql-backend@0.1.36-next.0 + - @backstage/plugin-kafka-backend@0.2.39-next.0 + - @backstage/plugin-permission-backend@0.5.21-next.0 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-permission-node@0.7.9-next.0 + - @backstage/plugin-proxy-backend@0.2.40-next.0 + - @backstage/plugin-rollbar-backend@0.1.43-next.0 + - @backstage/plugin-search-backend@1.3.2-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.1-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.7-next.0 + - @backstage/plugin-search-backend-node@1.2.2-next.0 + - @backstage/plugin-search-common@1.2.3 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.30-next.0 + - @backstage/plugin-tech-insights-node@0.4.4-next.0 + +## 0.2.83 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.14.0 + - @backstage/plugin-devtools-backend@0.1.0 + - @backstage/plugin-catalog-backend@1.9.1 + - @backstage/backend-common@0.18.5 + - @backstage/plugin-kubernetes-backend@0.11.0 + - @backstage/plugin-auth-backend@0.18.3 + - @backstage/plugin-badges-backend@0.2.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.0 + - @backstage/integration@1.4.5 + - @backstage/plugin-todo-backend@0.1.42 + - @backstage/plugin-jenkins-backend@0.2.0 + - @backstage/plugin-azure-sites-backend@0.1.7 + - @backstage/plugin-permission-node@0.7.8 + - @backstage/plugin-search-backend@1.3.1 + - example-app@0.2.83 + - @backstage/backend-tasks@0.5.2 + - @backstage/plugin-app-backend@0.3.45 + - @backstage/plugin-auth-node@0.2.14 + - @backstage/plugin-catalog-node@1.3.6 + - @backstage/plugin-entity-feedback-backend@0.1.3 + - @backstage/plugin-events-backend@0.2.6 + - @backstage/plugin-playlist-backend@0.3.1 + - @backstage/plugin-rollbar-backend@0.1.42 + - @backstage/plugin-search-backend-module-pg@0.5.6 + - @backstage/plugin-tech-insights-backend@0.5.11 + - @backstage/plugin-techdocs-backend@1.6.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.14 + - @backstage/plugin-adr-backend@0.3.3 + - @backstage/plugin-azure-devops-backend@0.3.24 + - @backstage/plugin-code-coverage-backend@0.2.11 + - @backstage/plugin-explore-backend@0.0.7 + - @backstage/plugin-graphql-backend@0.1.35 + - @backstage/plugin-kafka-backend@0.2.38 + - @backstage/plugin-lighthouse-backend@0.2.1 + - @backstage/plugin-linguist-backend@0.2.2 + - @backstage/plugin-permission-backend@0.5.20 + - @backstage/plugin-proxy-backend@0.2.39 + - @backstage/plugin-search-backend-node@1.2.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.29 + - @backstage/plugin-tech-insights-node@0.4.3 + - @backstage/catalog-client@1.4.1 + - @backstage/catalog-model@1.3.0 + - @backstage/config@1.0.7 + - @backstage/plugin-events-node@0.2.6 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-search-common@1.2.3 + +## 0.2.83-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-devtools-backend@0.1.0-next.0 + - @backstage/plugin-catalog-backend@1.9.1-next.2 + - @backstage/plugin-badges-backend@0.2.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.3.0-next.2 + - @backstage/plugin-kubernetes-backend@0.11.0-next.2 + - @backstage/plugin-auth-backend@0.18.3-next.2 + - @backstage/plugin-search-backend@1.3.1-next.2 + - example-app@0.2.83-next.2 + - @backstage/plugin-scaffolder-backend@1.13.2-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.14-next.2 + - @backstage/config@1.0.7 + +## 0.2.83-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.1 + - @backstage/plugin-kubernetes-backend@0.11.0-next.1 + - @backstage/plugin-catalog-backend@1.9.1-next.1 + - @backstage/plugin-jenkins-backend@0.1.35-next.1 + - @backstage/plugin-scaffolder-backend@1.13.2-next.1 + - example-app@0.2.83-next.1 + - @backstage/backend-tasks@0.5.2-next.1 + - @backstage/plugin-adr-backend@0.3.3-next.1 + - @backstage/plugin-app-backend@0.3.45-next.1 + - @backstage/plugin-auth-backend@0.18.3-next.1 + - @backstage/plugin-auth-node@0.2.14-next.1 + - @backstage/plugin-azure-devops-backend@0.3.24-next.1 + - @backstage/plugin-azure-sites-backend@0.1.7-next.1 + - @backstage/plugin-badges-backend@0.1.39-next.1 + - @backstage/plugin-catalog-node@1.3.6-next.1 + - @backstage/plugin-code-coverage-backend@0.2.11-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.3-next.1 + - @backstage/plugin-events-backend@0.2.6-next.1 + - @backstage/plugin-explore-backend@0.0.7-next.1 + - @backstage/plugin-graphql-backend@0.1.35-next.1 + - @backstage/plugin-kafka-backend@0.2.38-next.1 + - @backstage/plugin-lighthouse-backend@0.2.1-next.1 + - @backstage/plugin-linguist-backend@0.2.2-next.1 + - @backstage/plugin-permission-backend@0.5.20-next.1 + - @backstage/plugin-permission-node@0.7.8-next.1 + - @backstage/plugin-playlist-backend@0.3.1-next.1 + - @backstage/plugin-proxy-backend@0.2.39-next.1 + - @backstage/plugin-rollbar-backend@0.1.42-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.14-next.1 + - @backstage/plugin-search-backend@1.3.1-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.2.1-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.6-next.1 + - @backstage/plugin-search-backend-node@1.2.1-next.1 + - @backstage/plugin-tech-insights-backend@0.5.11-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.29-next.1 + - @backstage/plugin-tech-insights-node@0.4.3-next.1 + - @backstage/plugin-techdocs-backend@1.6.2-next.1 + - @backstage/plugin-todo-backend@0.1.42-next.1 + - @backstage/config@1.0.7 + - @backstage/plugin-events-node@0.2.6-next.1 + +## 0.2.83-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.0 + - @backstage/integration@1.4.5-next.0 + - @backstage/plugin-permission-node@0.7.8-next.0 + - @backstage/plugin-scaffolder-backend@1.13.2-next.0 + - @backstage/plugin-kubernetes-backend@0.11.0-next.0 + - @backstage/backend-tasks@0.5.2-next.0 + - @backstage/plugin-app-backend@0.3.45-next.0 + - @backstage/plugin-auth-backend@0.18.3-next.0 + - @backstage/plugin-auth-node@0.2.14-next.0 + - @backstage/plugin-catalog-backend@1.9.1-next.0 + - @backstage/plugin-catalog-node@1.3.6-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.3-next.0 + - @backstage/plugin-events-backend@0.2.6-next.0 + - @backstage/plugin-playlist-backend@0.3.1-next.0 + - @backstage/plugin-rollbar-backend@0.1.42-next.0 + - @backstage/plugin-search-backend@1.3.1-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.6-next.0 + - @backstage/plugin-tech-insights-backend@0.5.11-next.0 + - @backstage/plugin-techdocs-backend@1.6.2-next.0 + - example-app@0.2.83-next.0 + - @backstage/plugin-adr-backend@0.3.3-next.0 + - @backstage/plugin-azure-devops-backend@0.3.24-next.0 + - @backstage/plugin-azure-sites-backend@0.1.7-next.0 + - @backstage/plugin-badges-backend@0.1.39-next.0 + - @backstage/plugin-code-coverage-backend@0.2.11-next.0 + - @backstage/plugin-explore-backend@0.0.7-next.0 + - @backstage/plugin-graphql-backend@0.1.35-next.0 + - @backstage/plugin-jenkins-backend@0.1.35-next.0 + - @backstage/plugin-kafka-backend@0.2.38-next.0 + - @backstage/plugin-lighthouse-backend@0.2.1-next.0 + - @backstage/plugin-linguist-backend@0.2.2-next.0 + - @backstage/plugin-permission-backend@0.5.20-next.0 + - @backstage/plugin-proxy-backend@0.2.39-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.14-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.2.1-next.0 + - @backstage/plugin-search-backend-node@1.2.1-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.29-next.0 + - @backstage/plugin-tech-insights-node@0.4.3-next.0 + - @backstage/plugin-todo-backend@0.1.42-next.0 + - @backstage/catalog-client@1.4.1 + - @backstage/catalog-model@1.3.0 + - @backstage/config@1.0.7 + - @backstage/plugin-events-node@0.2.6-next.0 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-search-common@1.2.3 + +## 0.2.82 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.10.0 + - @backstage/backend-common@0.18.4 + - @backstage/plugin-scaffolder-backend@1.13.0 + - @backstage/plugin-catalog-backend@1.9.0 + - @backstage/plugin-code-coverage-backend@0.2.10 + - @backstage/catalog-client@1.4.1 + - @backstage/plugin-permission-node@0.7.7 + - @backstage/plugin-permission-backend@0.5.19 + - @backstage/plugin-entity-feedback-backend@0.1.2 + - @backstage/plugin-rollbar-backend@0.1.41 + - @backstage/plugin-search-backend@1.3.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.2.0 + - @backstage/plugin-search-backend-module-pg@0.5.5 + - @backstage/plugin-auth-backend@0.18.2 + - @backstage/plugin-lighthouse-backend@0.2.0 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-playlist-backend@0.3.0 + - @backstage/backend-tasks@0.5.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28 + - @backstage/plugin-adr-backend@0.3.2 + - @backstage/plugin-graphql-backend@0.1.34 + - @backstage/catalog-model@1.3.0 + - @backstage/plugin-techdocs-backend@1.6.1 + - @backstage/plugin-explore-backend@0.0.6 + - @backstage/plugin-events-backend@0.2.5 + - @backstage/plugin-search-backend-node@1.2.0 + - @backstage/integration@1.4.4 + - example-app@0.2.82 + - @backstage/plugin-app-backend@0.3.44 + - @backstage/plugin-auth-node@0.2.13 + - @backstage/plugin-azure-devops-backend@0.3.23 + - @backstage/plugin-azure-sites-backend@0.1.6 + - @backstage/plugin-badges-backend@0.1.38 + - @backstage/plugin-catalog-node@1.3.5 + - @backstage/plugin-jenkins-backend@0.1.34 + - @backstage/plugin-kafka-backend@0.2.37 + - @backstage/plugin-linguist-backend@0.2.1 + - @backstage/plugin-proxy-backend@0.2.38 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.12 + - @backstage/plugin-tech-insights-backend@0.5.10 + - @backstage/plugin-tech-insights-node@0.4.2 + - @backstage/plugin-todo-backend@0.1.41 + - @backstage/config@1.0.7 + - @backstage/plugin-events-node@0.2.5 + - @backstage/plugin-search-common@1.2.3 + +## 0.2.82-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.10.0-next.3 + - @backstage/plugin-catalog-backend@1.9.0-next.3 + - @backstage/plugin-code-coverage-backend@0.2.10-next.3 + - @backstage/plugin-lighthouse-backend@0.2.0-next.3 + - @backstage/plugin-auth-backend@0.18.2-next.3 + - @backstage/plugin-scaffolder-backend@1.13.0-next.3 + - @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.3 + - @backstage/catalog-model@1.3.0-next.0 + - @backstage/plugin-events-backend@0.2.5-next.3 + - example-app@0.2.82-next.3 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-client@1.4.1-next.1 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-adr-backend@0.3.2-next.3 + - @backstage/plugin-app-backend@0.3.44-next.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-azure-devops-backend@0.3.23-next.2 + - @backstage/plugin-azure-sites-backend@0.1.6-next.2 + - @backstage/plugin-badges-backend@0.1.38-next.3 + - @backstage/plugin-catalog-node@1.3.5-next.3 + - @backstage/plugin-entity-feedback-backend@0.1.2-next.3 + - @backstage/plugin-events-node@0.2.5-next.2 + - @backstage/plugin-explore-backend@0.0.6-next.2 + - @backstage/plugin-graphql-backend@0.1.34-next.3 + - @backstage/plugin-jenkins-backend@0.1.34-next.3 + - @backstage/plugin-kafka-backend@0.2.37-next.3 + - @backstage/plugin-linguist-backend@0.2.1-next.3 + - @backstage/plugin-permission-backend@0.5.19-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/plugin-playlist-backend@0.2.7-next.3 + - @backstage/plugin-proxy-backend@0.2.38-next.2 + - @backstage/plugin-rollbar-backend@0.1.41-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.3 + - @backstage/plugin-search-backend@1.3.0-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.5-next.2 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-tech-insights-backend@0.5.10-next.3 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.2 + - @backstage/plugin-tech-insights-node@0.4.2-next.2 + - @backstage/plugin-techdocs-backend@1.6.1-next.3 + - @backstage/plugin-todo-backend@0.1.41-next.3 + +## 0.2.82-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.10.0-next.2 + - @backstage/plugin-catalog-backend@1.8.1-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/catalog-client@1.4.1-next.0 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/plugin-permission-backend@0.5.19-next.2 + - @backstage/plugin-rollbar-backend@0.1.41-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.2 + - @backstage/plugin-scaffolder-backend@1.13.0-next.2 + - example-app@0.2.82-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-adr-backend@0.3.2-next.2 + - @backstage/plugin-app-backend@0.3.44-next.2 + - @backstage/plugin-auth-backend@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-azure-devops-backend@0.3.23-next.2 + - @backstage/plugin-azure-sites-backend@0.1.6-next.2 + - @backstage/plugin-badges-backend@0.1.38-next.2 + - @backstage/plugin-catalog-node@1.3.5-next.2 + - @backstage/plugin-code-coverage-backend@0.2.10-next.2 + - @backstage/plugin-entity-feedback-backend@0.1.2-next.2 + - @backstage/plugin-events-backend@0.2.5-next.2 + - @backstage/plugin-events-node@0.2.5-next.2 + - @backstage/plugin-explore-backend@0.0.6-next.2 + - @backstage/plugin-graphql-backend@0.1.34-next.2 + - @backstage/plugin-jenkins-backend@0.1.34-next.2 + - @backstage/plugin-kafka-backend@0.2.37-next.2 + - @backstage/plugin-lighthouse-backend@0.1.2-next.2 + - @backstage/plugin-linguist-backend@0.2.1-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-playlist-backend@0.2.7-next.2 + - @backstage/plugin-proxy-backend@0.2.38-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.2 + - @backstage/plugin-search-backend@1.3.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.5-next.2 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-tech-insights-backend@0.5.10-next.2 + - @backstage/plugin-tech-insights-node@0.4.2-next.2 + - @backstage/plugin-techdocs-backend@1.6.1-next.2 + - @backstage/plugin-todo-backend@0.1.41-next.2 + +## 0.2.82-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend@1.3.0-next.1 + - @backstage/plugin-scaffolder-backend@1.13.0-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.5-next.1 + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-backend@0.5.19-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-playlist-backend@0.2.7-next.1 + - @backstage/plugin-catalog-backend@1.8.1-next.1 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/plugin-adr-backend@0.3.2-next.1 + - @backstage/plugin-kubernetes-backend@0.10.0-next.1 + - @backstage/plugin-techdocs-backend@1.6.1-next.1 + - @backstage/plugin-explore-backend@0.0.6-next.1 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/integration@1.4.4-next.0 + - @backstage/plugin-auth-backend@0.18.2-next.1 + - example-app@0.2.82-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-app-backend@0.3.44-next.1 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-azure-devops-backend@0.3.23-next.1 + - @backstage/plugin-azure-sites-backend@0.1.6-next.1 + - @backstage/plugin-badges-backend@0.1.38-next.1 + - @backstage/plugin-catalog-node@1.3.5-next.1 + - @backstage/plugin-code-coverage-backend@0.2.10-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.2-next.1 + - @backstage/plugin-events-backend@0.2.5-next.1 + - @backstage/plugin-events-node@0.2.5-next.1 + - @backstage/plugin-graphql-backend@0.1.34-next.1 + - @backstage/plugin-jenkins-backend@0.1.34-next.1 + - @backstage/plugin-kafka-backend@0.2.37-next.1 + - @backstage/plugin-lighthouse-backend@0.1.2-next.1 + - @backstage/plugin-linguist-backend@0.2.1-next.1 + - @backstage/plugin-proxy-backend@0.2.38-next.1 + - @backstage/plugin-rollbar-backend@0.1.41-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-tech-insights-backend@0.5.10-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.1 + - @backstage/plugin-tech-insights-node@0.4.2-next.1 + - @backstage/plugin-todo-backend@0.1.41-next.1 + +## 0.2.82-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.1-next.0 + - @backstage/plugin-kubernetes-backend@0.10.0-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.2-next.0 + - @backstage/plugin-auth-backend@0.18.2-next.0 + - @backstage/plugin-catalog-backend@1.8.1-next.0 + - @backstage/plugin-graphql-backend@0.1.34-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.0 + - example-app@0.2.82-next.0 + - @backstage/config@1.0.7 + - @backstage/integration@1.4.3 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/catalog-client@1.4.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-adr-backend@0.3.2-next.0 + - @backstage/plugin-app-backend@0.3.44-next.0 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-azure-devops-backend@0.3.23-next.0 + - @backstage/plugin-azure-sites-backend@0.1.6-next.0 + - @backstage/plugin-badges-backend@0.1.38-next.0 + - @backstage/plugin-catalog-node@1.3.5-next.0 + - @backstage/plugin-code-coverage-backend@0.2.10-next.0 + - @backstage/plugin-events-backend@0.2.5-next.0 + - @backstage/plugin-events-node@0.2.5-next.0 + - @backstage/plugin-explore-backend@0.0.6-next.0 + - @backstage/plugin-jenkins-backend@0.1.34-next.0 + - @backstage/plugin-kafka-backend@0.2.37-next.0 + - @backstage/plugin-lighthouse-backend@0.1.2-next.0 + - @backstage/plugin-linguist-backend@0.2.1-next.0 + - @backstage/plugin-permission-backend@0.5.19-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + - @backstage/plugin-playlist-backend@0.2.7-next.0 + - @backstage/plugin-proxy-backend@0.2.38-next.0 + - @backstage/plugin-rollbar-backend@0.1.41-next.0 + - @backstage/plugin-search-backend@1.2.5-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.5-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.5-next.0 + - @backstage/plugin-search-backend-node@1.1.5-next.0 + - @backstage/plugin-search-common@1.2.2 + - @backstage/plugin-tech-insights-backend@0.5.10-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.0 + - @backstage/plugin-tech-insights-node@0.4.2-next.0 + - @backstage/plugin-techdocs-backend@1.6.1-next.0 + - @backstage/plugin-todo-backend@0.1.41-next.0 + +## 0.2.81 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-todo-backend@0.1.40 + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.4 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/plugin-techdocs-backend@1.6.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/plugin-tech-insights-backend@0.5.9 + - @backstage/plugin-adr-backend@0.3.1 + - @backstage/plugin-auth-backend@0.18.1 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-linguist-backend@0.2.0 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-events-backend@0.2.4 + - @backstage/plugin-app-backend@0.3.43 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/plugin-azure-devops-backend@0.3.22 + - @backstage/plugin-azure-sites-backend@0.1.5 + - @backstage/plugin-code-coverage-backend@0.2.9 + - @backstage/plugin-entity-feedback-backend@0.1.1 + - @backstage/plugin-explore-backend@0.0.5 + - @backstage/plugin-graphql-backend@0.1.33 + - @backstage/plugin-jenkins-backend@0.1.33 + - @backstage/plugin-kubernetes-backend@0.9.4 + - @backstage/plugin-permission-backend@0.5.18 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-playlist-backend@0.2.6 + - @backstage/plugin-proxy-backend@0.2.37 + - @backstage/plugin-rollbar-backend@0.1.40 + - @backstage/plugin-lighthouse-backend@0.1.1 + - @backstage/config@1.0.7 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.11 + - @backstage/plugin-badges-backend@0.1.37 + - example-app@0.2.81 + - @backstage/plugin-search-backend@1.2.4 + - @backstage/plugin-kafka-backend@0.2.36 + - @backstage/plugin-search-backend-module-pg@0.5.4 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + - @backstage/plugin-tech-insights-node@0.4.1 + +## 0.2.81-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.4-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27-next.2 + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/plugin-adr-backend@0.3.1-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-linguist-backend@0.2.0-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.11-next.2 + - example-app@0.2.81-next.2 + - @backstage/plugin-techdocs-backend@1.5.4-next.2 + - @backstage/plugin-auth-backend@0.18.1-next.2 + - @backstage/plugin-entity-feedback-backend@0.1.1-next.2 + - @backstage/plugin-jenkins-backend@0.1.33-next.2 + - @backstage/plugin-kubernetes-backend@0.9.4-next.2 + - @backstage/plugin-permission-backend@0.5.18-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/plugin-playlist-backend@0.2.6-next.2 + - @backstage/plugin-search-backend@1.2.4-next.2 + - @backstage/plugin-lighthouse-backend@0.1.1-next.2 + - @backstage/plugin-search-backend-node@1.1.4-next.2 + - @backstage/plugin-tech-insights-backend@0.5.9-next.2 + - @backstage/plugin-tech-insights-node@0.4.1-next.2 + - @backstage/plugin-app-backend@0.3.43-next.2 + - @backstage/plugin-azure-devops-backend@0.3.22-next.2 + - @backstage/plugin-azure-sites-backend@0.1.5-next.2 + - @backstage/plugin-badges-backend@0.1.37-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/plugin-code-coverage-backend@0.2.9-next.2 + - @backstage/plugin-events-backend@0.2.4-next.2 + - @backstage/plugin-explore-backend@0.0.5-next.2 + - @backstage/plugin-graphql-backend@0.1.33-next.2 + - @backstage/plugin-kafka-backend@0.2.36-next.2 + - @backstage/plugin-proxy-backend@0.2.37-next.2 + - @backstage/plugin-rollbar-backend@0.1.40-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.4-next.2 + - @backstage/plugin-todo-backend@0.1.40-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## 0.2.81-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0-next.1 + - @backstage/plugin-permission-node@0.7.6-next.1 + - @backstage/plugin-techdocs-backend@1.5.4-next.1 + - @backstage/plugin-auth-backend@0.18.1-next.1 + - @backstage/backend-common@0.18.3-next.1 + - @backstage/catalog-client@1.4.0-next.1 + - @backstage/integration@1.4.3-next.0 + - @backstage/plugin-adr-backend@0.3.1-next.1 + - @backstage/plugin-app-backend@0.3.43-next.1 + - @backstage/plugin-auth-node@0.2.12-next.1 + - @backstage/plugin-azure-devops-backend@0.3.22-next.1 + - @backstage/plugin-azure-sites-backend@0.1.5-next.1 + - @backstage/plugin-catalog-backend@1.8.0-next.1 + - @backstage/plugin-code-coverage-backend@0.2.9-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.1-next.1 + - @backstage/plugin-explore-backend@0.0.5-next.1 + - @backstage/plugin-graphql-backend@0.1.33-next.1 + - @backstage/plugin-jenkins-backend@0.1.33-next.1 + - @backstage/plugin-kubernetes-backend@0.9.4-next.1 + - @backstage/plugin-linguist-backend@0.2.0-next.1 + - @backstage/plugin-permission-backend@0.5.18-next.1 + - @backstage/plugin-permission-common@0.7.4-next.0 + - @backstage/plugin-playlist-backend@0.2.6-next.1 + - @backstage/plugin-proxy-backend@0.2.37-next.1 + - @backstage/plugin-rollbar-backend@0.1.40-next.1 + - @backstage/plugin-todo-backend@0.1.40-next.1 + - @backstage/plugin-lighthouse-backend@0.1.1-next.1 + - @backstage/backend-tasks@0.4.4-next.1 + - @backstage/config@1.0.7-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.11-next.1 + - @backstage/plugin-search-backend@1.2.4-next.1 + - example-app@0.2.81-next.1 + - @backstage/catalog-model@1.2.1-next.1 + - @backstage/plugin-badges-backend@0.1.37-next.1 + - @backstage/plugin-catalog-node@1.3.4-next.1 + - @backstage/plugin-events-backend@0.2.4-next.1 + - @backstage/plugin-events-node@0.2.4-next.1 + - @backstage/plugin-kafka-backend@0.2.36-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.4-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.4-next.1 + - @backstage/plugin-search-backend-node@1.1.4-next.1 + - @backstage/plugin-search-common@1.2.2-next.0 + - @backstage/plugin-tech-insights-backend@0.5.9-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27-next.1 + - @backstage/plugin-tech-insights-node@0.4.1-next.1 + +## 0.2.81-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.0-next.0 + - @backstage/plugin-todo-backend@0.1.40-next.0 + - @backstage/plugin-scaffolder-backend@1.11.1-next.0 + - @backstage/plugin-catalog-backend@1.8.0-next.0 + - @backstage/plugin-tech-insights-backend@0.5.9-next.0 + - @backstage/plugin-linguist-backend@0.2.0-next.0 + - @backstage/plugin-adr-backend@0.3.1-next.0 + - @backstage/backend-tasks@0.4.4-next.0 + - @backstage/plugin-techdocs-backend@1.5.4-next.0 + - @backstage/backend-common@0.18.3-next.0 + - @backstage/catalog-model@1.2.1-next.0 + - @backstage/plugin-events-backend@0.2.4-next.0 + - @backstage/plugin-catalog-node@1.3.4-next.0 + - @backstage/plugin-app-backend@0.3.43-next.0 + - @backstage/plugin-events-node@0.2.4-next.0 + - @backstage/plugin-proxy-backend@0.2.37-next.0 + - @backstage/plugin-auth-backend@0.18.1-next.0 + - @backstage/plugin-badges-backend@0.1.37-next.0 + - @backstage/plugin-code-coverage-backend@0.2.9-next.0 + - @backstage/plugin-entity-feedback-backend@0.1.1-next.0 + - @backstage/plugin-jenkins-backend@0.1.33-next.0 + - @backstage/plugin-kubernetes-backend@0.9.4-next.0 + - @backstage/plugin-lighthouse-backend@0.1.1-next.0 + - @backstage/plugin-playlist-backend@0.2.6-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.11-next.0 + - example-app@0.2.81-next.0 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/plugin-auth-node@0.2.12-next.0 + - @backstage/plugin-azure-devops-backend@0.3.22-next.0 + - @backstage/plugin-azure-sites-backend@0.1.5-next.0 + - @backstage/plugin-explore-backend@0.0.5-next.0 + - @backstage/plugin-graphql-backend@0.1.33-next.0 + - @backstage/plugin-kafka-backend@0.2.36-next.0 + - @backstage/plugin-permission-backend@0.5.18-next.0 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.6-next.0 + - @backstage/plugin-rollbar-backend@0.1.40-next.0 + - @backstage/plugin-search-backend@1.2.4-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.4-next.0 + - @backstage/plugin-search-backend-module-pg@0.5.4-next.0 + - @backstage/plugin-search-backend-node@1.1.4-next.0 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27-next.0 + - @backstage/plugin-tech-insights-node@0.4.1-next.0 + +## 0.2.80 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2 + - @backstage/plugin-playlist-backend@0.2.5 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.3 + - @backstage/backend-common@0.18.2 + - @backstage/plugin-kubernetes-backend@0.9.3 + - @backstage/plugin-lighthouse-backend@0.1.0 + - @backstage/plugin-code-coverage-backend@0.2.8 + - @backstage/plugin-azure-devops-backend@0.3.21 + - @backstage/plugin-azure-sites-backend@0.1.4 + - @backstage/plugin-adr-backend@0.3.0 + - @backstage/plugin-tech-insights-backend@0.5.8 + - @backstage/plugin-tech-insights-node@0.4.0 + - @backstage/plugin-entity-feedback-backend@0.1.0 + - @backstage/plugin-search-backend@1.2.3 + - @backstage/plugin-techdocs-backend@1.5.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.10 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26 + - @backstage/plugin-scaffolder-backend@1.11.0 + - @backstage/plugin-events-backend@0.2.3 + - @backstage/plugin-kafka-backend@0.2.35 + - @backstage/plugin-proxy-backend@0.2.36 + - @backstage/plugin-app-backend@0.3.42 + - @backstage/catalog-model@1.2.0 + - @backstage/plugin-auth-backend@0.18.0 + - @backstage/plugin-linguist-backend@0.1.0 + - @backstage/plugin-events-node@0.2.3 + - example-app@0.2.80 + - @backstage/plugin-catalog-node@1.3.3 + - @backstage/backend-tasks@0.4.3 + - @backstage/catalog-client@1.3.1 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/plugin-auth-node@0.2.11 + - @backstage/plugin-badges-backend@0.1.36 + - @backstage/plugin-explore-backend@0.0.4 + - @backstage/plugin-graphql-backend@0.1.32 + - @backstage/plugin-jenkins-backend@0.1.32 + - @backstage/plugin-permission-backend@0.5.17 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5 + - @backstage/plugin-rollbar-backend@0.1.39 + - @backstage/plugin-search-backend-module-pg@0.5.3 + - @backstage/plugin-search-backend-node@1.1.3 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-todo-backend@0.1.39 + +## 0.2.80-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-lighthouse-backend@0.1.0-next.0 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/plugin-search-backend@1.2.3-next.2 + - @backstage/plugin-scaffolder-backend@1.11.0-next.2 + - @backstage/plugin-events-backend@0.2.3-next.2 + - @backstage/plugin-kafka-backend@0.2.35-next.2 + - @backstage/plugin-proxy-backend@0.2.36-next.2 + - @backstage/plugin-app-backend@0.3.42-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-kubernetes-backend@0.9.3-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/plugin-auth-backend@0.17.5-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/plugin-playlist-backend@0.2.5-next.2 + - @backstage/plugin-rollbar-backend@0.1.39-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.3-next.2 + - @backstage/plugin-tech-insights-backend@0.5.8-next.2 + - @backstage/plugin-techdocs-backend@1.5.3-next.2 + - example-app@0.2.80-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/plugin-adr-backend@0.2.7-next.2 + - @backstage/plugin-azure-devops-backend@0.3.21-next.2 + - @backstage/plugin-azure-sites-backend@0.1.4-next.2 + - @backstage/plugin-badges-backend@0.1.36-next.2 + - @backstage/plugin-code-coverage-backend@0.2.8-next.2 + - @backstage/plugin-explore-backend@0.0.4-next.2 + - @backstage/plugin-graphql-backend@0.1.32-next.2 + - @backstage/plugin-jenkins-backend@0.1.32-next.2 + - @backstage/plugin-permission-backend@0.5.17-next.2 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.10-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.3-next.2 + - @backstage/plugin-search-backend-node@1.1.3-next.2 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26-next.2 + - @backstage/plugin-tech-insights-node@0.4.0-next.2 + - @backstage/plugin-todo-backend@0.1.39-next.2 + +## 0.2.80-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.1 + - @backstage/plugin-tech-insights-backend@0.5.8-next.1 + - @backstage/plugin-tech-insights-node@0.4.0-next.1 + - @backstage/plugin-azure-devops-backend@0.3.21-next.1 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/plugin-kubernetes-backend@0.9.3-next.1 + - @backstage/plugin-scaffolder-backend@1.11.0-next.1 + - @backstage/plugin-playlist-backend@0.2.5-next.1 + - example-app@0.2.80-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/catalog-client@1.3.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/plugin-adr-backend@0.2.7-next.1 + - @backstage/plugin-app-backend@0.3.42-next.1 + - @backstage/plugin-auth-backend@0.17.5-next.1 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-azure-sites-backend@0.1.4-next.1 + - @backstage/plugin-badges-backend@0.1.36-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.1 + - @backstage/plugin-code-coverage-backend@0.2.8-next.1 + - @backstage/plugin-events-backend@0.2.3-next.1 + - @backstage/plugin-events-node@0.2.3-next.1 + - @backstage/plugin-explore-backend@0.0.4-next.1 + - @backstage/plugin-graphql-backend@0.1.32-next.1 + - @backstage/plugin-jenkins-backend@0.1.32-next.1 + - @backstage/plugin-kafka-backend@0.2.35-next.1 + - @backstage/plugin-permission-backend@0.5.17-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + - @backstage/plugin-proxy-backend@0.2.36-next.1 + - @backstage/plugin-rollbar-backend@0.1.39-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.10-next.1 + - @backstage/plugin-search-backend@1.2.3-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.3-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.3-next.1 + - @backstage/plugin-search-backend-node@1.1.3-next.1 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26-next.1 + - @backstage/plugin-techdocs-backend@1.5.3-next.1 + - @backstage/plugin-todo-backend@0.1.39-next.1 + +## 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 + +## 0.2.79 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.10.0 + - @backstage/backend-common@0.18.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.8 + - @backstage/plugin-adr-backend@0.2.5 + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.1 + - @backstage/plugin-search-backend-node@1.1.1 + - @backstage/catalog-client@1.3.0 + - @backstage/plugin-explore-backend@0.0.2 + - @backstage/backend-tasks@0.4.1 + - @backstage/plugin-events-backend@0.2.1 + - @backstage/plugin-catalog-node@1.3.1 + - @backstage/plugin-app-backend@0.3.40 + - @backstage/plugin-code-coverage-backend@0.2.6 + - @backstage/plugin-catalog-backend@1.7.0 + - @backstage/plugin-tech-insights-backend@0.5.6 + - @backstage/plugin-kubernetes-backend@0.9.1 + - @backstage/config@1.0.6 + - @backstage/plugin-search-backend@1.2.1 + - @backstage/plugin-events-node@0.2.1 + - example-app@0.2.79 + - @backstage/integration@1.4.2 + - @backstage/plugin-auth-backend@0.17.3 + - @backstage/plugin-auth-node@0.2.9 + - @backstage/plugin-azure-devops-backend@0.3.19 + - @backstage/plugin-azure-sites-backend@0.1.2 + - @backstage/plugin-badges-backend@0.1.34 + - @backstage/plugin-graphql-backend@0.1.30 + - @backstage/plugin-jenkins-backend@0.1.30 + - @backstage/plugin-kafka-backend@0.2.33 + - @backstage/plugin-permission-backend@0.5.15 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.3 + - @backstage/plugin-playlist-backend@0.2.3 + - @backstage/plugin-proxy-backend@0.2.34 + - @backstage/plugin-rollbar-backend@0.1.37 + - @backstage/plugin-search-backend-module-pg@0.5.1 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.24 + - @backstage/plugin-tech-insights-node@0.3.8 + - @backstage/plugin-techdocs-backend@1.5.1 + - @backstage/plugin-todo-backend@0.1.37 + +## 0.2.79-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-adr-backend@0.2.5-next.2 + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.8-next.2 + - @backstage/plugin-scaffolder-backend@1.10.0-next.2 + - @backstage/backend-tasks@0.4.1-next.1 + - @backstage/catalog-client@1.3.0-next.2 + - @backstage/plugin-catalog-backend@1.7.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.1-next.2 + - @backstage/plugin-events-backend@0.2.1-next.1 + - @backstage/plugin-app-backend@0.3.40-next.1 + - @backstage/plugin-kubernetes-backend@0.9.1-next.2 + - @backstage/plugin-catalog-node@1.3.1-next.2 + - @backstage/plugin-events-node@0.2.1-next.1 + - @backstage/plugin-auth-backend@0.17.3-next.2 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/plugin-permission-node@0.7.3-next.1 + - @backstage/plugin-playlist-backend@0.2.3-next.2 + - @backstage/plugin-rollbar-backend@0.1.37-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.1-next.2 + - @backstage/plugin-tech-insights-backend@0.5.6-next.2 + - @backstage/plugin-techdocs-backend@1.5.1-next.2 + - example-app@0.2.79-next.2 + - @backstage/plugin-azure-devops-backend@0.3.19-next.1 + - @backstage/plugin-azure-sites-backend@0.1.2-next.1 + - @backstage/plugin-badges-backend@0.1.34-next.2 + - @backstage/plugin-code-coverage-backend@0.2.6-next.2 + - @backstage/plugin-explore-backend@0.0.2-next.2 + - @backstage/plugin-graphql-backend@0.1.30-next.2 + - @backstage/plugin-jenkins-backend@0.1.30-next.2 + - @backstage/plugin-kafka-backend@0.2.33-next.2 + - @backstage/plugin-permission-backend@0.5.15-next.1 + - @backstage/plugin-proxy-backend@0.2.34-next.1 + - @backstage/plugin-search-backend@1.2.1-next.2 + - @backstage/plugin-search-backend-node@1.1.1-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.24-next.1 + - @backstage/plugin-tech-insights-node@0.3.8-next.1 + - @backstage/plugin-todo-backend@0.1.37-next.2 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/integration@1.4.2-next.0 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 0.2.79-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.10.0-next.1 + - @backstage/backend-common@0.18.0-next.0 + - @backstage/plugin-explore-backend@0.0.2-next.1 + - @backstage/plugin-events-backend@0.2.1-next.0 + - @backstage/plugin-app-backend@0.3.40-next.0 + - @backstage/plugin-tech-insights-backend@0.5.6-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/plugin-catalog-backend@1.7.0-next.1 + - @backstage/plugin-catalog-node@1.3.1-next.1 + - @backstage/plugin-events-node@0.2.1-next.0 + - example-app@0.2.79-next.1 + - @backstage/backend-tasks@0.4.1-next.0 + - @backstage/catalog-client@1.3.0-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/integration@1.4.2-next.0 + - @backstage/plugin-auth-backend@0.17.3-next.1 + - @backstage/plugin-auth-node@0.2.9-next.0 + - @backstage/plugin-azure-devops-backend@0.3.19-next.0 + - @backstage/plugin-azure-sites-backend@0.1.2-next.0 + - @backstage/plugin-badges-backend@0.1.34-next.1 + - @backstage/plugin-code-coverage-backend@0.2.6-next.1 + - @backstage/plugin-graphql-backend@0.1.30-next.1 + - @backstage/plugin-jenkins-backend@0.1.30-next.1 + - @backstage/plugin-kafka-backend@0.2.33-next.1 + - @backstage/plugin-kubernetes-backend@0.9.1-next.1 + - @backstage/plugin-permission-backend@0.5.15-next.0 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-permission-node@0.7.3-next.0 + - @backstage/plugin-playlist-backend@0.2.3-next.1 + - @backstage/plugin-proxy-backend@0.2.34-next.0 + - @backstage/plugin-rollbar-backend@0.1.37-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.8-next.1 + - @backstage/plugin-search-backend@1.2.1-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.1-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.1-next.1 + - @backstage/plugin-search-backend-node@1.1.1-next.1 + - @backstage/plugin-search-common@1.2.1-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.24-next.0 + - @backstage/plugin-tech-insights-node@0.3.8-next.0 + - @backstage/plugin-techdocs-backend@1.5.1-next.1 + - @backstage/plugin-todo-backend@0.1.37-next.1 + +## 0.2.79-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.5-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.1-next.0 + - @backstage/plugin-search-backend-node@1.1.1-next.0 + - @backstage/catalog-client@1.3.0-next.0 + - @backstage/plugin-explore-backend@0.0.2-next.0 + - @backstage/plugin-code-coverage-backend@0.2.6-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.8-next.0 + - @backstage/plugin-scaffolder-backend@1.9.1-next.0 + - @backstage/plugin-catalog-backend@1.7.0-next.0 + - @backstage/plugin-search-backend@1.2.1-next.0 + - example-app@0.2.79-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/backend-tasks@0.4.0 + - @backstage/config@1.0.5 + - @backstage/integration@1.4.1 + - @backstage/plugin-app-backend@0.3.39 + - @backstage/plugin-auth-backend@0.17.3-next.0 + - @backstage/plugin-auth-node@0.2.8 + - @backstage/plugin-azure-devops-backend@0.3.18 + - @backstage/plugin-azure-sites-backend@0.1.1 + - @backstage/plugin-badges-backend@0.1.34-next.0 + - @backstage/plugin-catalog-node@1.3.1-next.0 + - @backstage/plugin-events-backend@0.2.0 + - @backstage/plugin-events-node@0.2.0 + - @backstage/plugin-graphql-backend@0.1.30-next.0 + - @backstage/plugin-jenkins-backend@0.1.30-next.0 + - @backstage/plugin-kafka-backend@0.2.33-next.0 + - @backstage/plugin-kubernetes-backend@0.9.1-next.0 + - @backstage/plugin-permission-backend@0.5.14 + - @backstage/plugin-permission-common@0.7.2 + - @backstage/plugin-permission-node@0.7.2 + - @backstage/plugin-playlist-backend@0.2.3-next.0 + - @backstage/plugin-proxy-backend@0.2.33 + - @backstage/plugin-rollbar-backend@0.1.36 + - @backstage/plugin-search-backend-module-pg@0.5.1-next.0 + - @backstage/plugin-search-common@1.2.0 + - @backstage/plugin-tech-insights-backend@0.5.6-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23 + - @backstage/plugin-tech-insights-node@0.3.7 + - @backstage/plugin-techdocs-backend@1.5.1-next.0 + - @backstage/plugin-todo-backend@0.1.37-next.0 + +## 0.2.78 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.9.0 + - @backstage/plugin-azure-devops-backend@0.3.18 + - @backstage/plugin-kubernetes-backend@0.9.0 + - @backstage/plugin-catalog-backend@1.6.0 + - @backstage/catalog-client@1.2.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.7 + - @backstage/plugin-search-backend@1.2.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.0 + - @backstage/plugin-search-backend-node@1.1.0 + - @backstage/plugin-playlist-backend@0.2.2 + - @backstage/plugin-search-backend-module-pg@0.5.0 + - @backstage/backend-common@0.17.0 + - @backstage/plugin-app-backend@0.3.39 + - @backstage/plugin-catalog-node@1.3.0 + - @backstage/plugin-events-backend@0.2.0 + - @backstage/backend-tasks@0.4.0 + - @backstage/plugin-permission-backend@0.5.14 + - @backstage/plugin-permission-common@0.7.2 + - @backstage/plugin-permission-node@0.7.2 + - @backstage/plugin-kafka-backend@0.2.32 + - @backstage/plugin-jenkins-backend@0.1.29 + - @backstage/plugin-events-node@0.2.0 + - @backstage/integration@1.4.1 + - @backstage/plugin-auth-backend@0.17.2 + - @backstage/plugin-auth-node@0.2.8 + - @backstage/plugin-azure-sites-backend@0.1.1 + - @backstage/plugin-code-coverage-backend@0.2.5 + - @backstage/plugin-graphql-backend@0.1.29 + - @backstage/plugin-proxy-backend@0.2.33 + - @backstage/plugin-rollbar-backend@0.1.36 + - @backstage/plugin-techdocs-backend@1.5.0 + - @backstage/plugin-todo-backend@0.1.36 + - @backstage/plugin-explore-backend@0.0.1 + - @backstage/plugin-search-common@1.2.0 + - example-app@0.2.78 + - @backstage/plugin-badges-backend@0.1.33 + - @backstage/plugin-tech-insights-backend@0.5.5 + - @backstage/catalog-model@1.1.4 + - @backstage/config@1.0.5 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23 + - @backstage/plugin-tech-insights-node@0.3.7 + +## 0.2.78-next.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.6.0-next.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.3 + - @backstage/plugin-scaffolder-backend@1.9.0-next.3 + - @backstage/backend-tasks@0.4.0-next.3 + - @backstage/plugin-permission-backend@0.5.14-next.3 + - @backstage/plugin-permission-common@0.7.2-next.2 + - @backstage/plugin-permission-node@0.7.2-next.3 + - @backstage/plugin-playlist-backend@0.2.2-next.4 + - @backstage/plugin-search-backend@1.2.0-next.3 + - @backstage/plugin-kubernetes-backend@0.8.1-next.4 + - @backstage/backend-common@0.17.0-next.3 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.0-next.3 + - @backstage/plugin-techdocs-backend@1.5.0-next.3 + - example-app@0.2.78-next.4 + - @backstage/catalog-client@1.2.0-next.1 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/integration@1.4.1-next.1 + - @backstage/plugin-app-backend@0.3.39-next.3 + - @backstage/plugin-auth-backend@0.17.2-next.3 + - @backstage/plugin-auth-node@0.2.8-next.3 + - @backstage/plugin-azure-devops-backend@0.3.18-next.3 + - @backstage/plugin-azure-sites-backend@0.1.1-next.3 + - @backstage/plugin-badges-backend@0.1.33-next.3 + - @backstage/plugin-catalog-node@1.3.0-next.3 + - @backstage/plugin-code-coverage-backend@0.2.5-next.3 + - @backstage/plugin-events-backend@0.2.0-next.3 + - @backstage/plugin-events-node@0.2.0-next.3 + - @backstage/plugin-explore-backend@0.0.1-next.2 + - @backstage/plugin-graphql-backend@0.1.29-next.3 + - @backstage/plugin-jenkins-backend@0.1.29-next.3 + - @backstage/plugin-kafka-backend@0.2.32-next.3 + - @backstage/plugin-proxy-backend@0.2.33-next.3 + - @backstage/plugin-rollbar-backend@0.1.36-next.3 + - @backstage/plugin-search-backend-module-pg@0.4.3-next.3 + - @backstage/plugin-search-backend-node@1.1.0-next.3 + - @backstage/plugin-search-common@1.2.0-next.3 + - @backstage/plugin-tech-insights-backend@0.5.5-next.3 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.3 + - @backstage/plugin-tech-insights-node@0.3.7-next.3 + - @backstage/plugin-todo-backend@0.1.36-next.3 + +## 0.2.78-next.3 + +### Patch Changes + +- Updated dependencies + - example-app@0.2.78-next.3 + - @backstage/backend-common@0.17.0-next.2 + - @backstage/backend-tasks@0.4.0-next.2 + - @backstage/catalog-client@1.2.0-next.1 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/integration@1.4.1-next.1 + - @backstage/plugin-app-backend@0.3.39-next.2 + - @backstage/plugin-auth-backend@0.17.2-next.2 + - @backstage/plugin-auth-node@0.2.8-next.2 + - @backstage/plugin-azure-devops-backend@0.3.18-next.2 + - @backstage/plugin-azure-sites-backend@0.1.1-next.2 + - @backstage/plugin-badges-backend@0.1.33-next.2 + - @backstage/plugin-catalog-backend@1.6.0-next.2 + - @backstage/plugin-catalog-node@1.3.0-next.2 + - @backstage/plugin-code-coverage-backend@0.2.5-next.2 + - @backstage/plugin-events-backend@0.2.0-next.2 + - @backstage/plugin-events-node@0.2.0-next.2 + - @backstage/plugin-explore-backend@0.0.1-next.1 + - @backstage/plugin-graphql-backend@0.1.29-next.2 + - @backstage/plugin-jenkins-backend@0.1.29-next.2 + - @backstage/plugin-kafka-backend@0.2.32-next.2 + - @backstage/plugin-kubernetes-backend@0.8.1-next.3 + - @backstage/plugin-permission-backend@0.5.14-next.2 + - @backstage/plugin-permission-common@0.7.2-next.1 + - @backstage/plugin-permission-node@0.7.2-next.2 + - @backstage/plugin-playlist-backend@0.2.2-next.3 + - @backstage/plugin-proxy-backend@0.2.33-next.2 + - @backstage/plugin-rollbar-backend@0.1.36-next.2 + - @backstage/plugin-scaffolder-backend@1.9.0-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.2 + - @backstage/plugin-search-backend@1.2.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.0-next.2 + - @backstage/plugin-search-backend-module-pg@0.4.3-next.2 + - @backstage/plugin-search-backend-node@1.1.0-next.2 + - @backstage/plugin-search-common@1.2.0-next.2 + - @backstage/plugin-tech-insights-backend@0.5.5-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.2 + - @backstage/plugin-tech-insights-node@0.3.7-next.2 + - @backstage/plugin-techdocs-backend@1.4.2-next.2 + - @backstage/plugin-todo-backend@0.1.36-next.2 + +## 0.2.78-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-azure-devops-backend@0.3.18-next.2 + - @backstage/plugin-search-backend@1.2.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.0-next.2 + - @backstage/plugin-search-backend-node@1.1.0-next.2 + - @backstage/plugin-catalog-backend@1.6.0-next.2 + - @backstage/plugin-playlist-backend@0.2.2-next.2 + - @backstage/plugin-search-backend-module-pg@0.4.3-next.2 + - @backstage/plugin-app-backend@0.3.39-next.2 + - @backstage/plugin-catalog-node@1.3.0-next.2 + - @backstage/plugin-events-backend@0.2.0-next.2 + - @backstage/plugin-scaffolder-backend@1.9.0-next.2 + - @backstage/backend-common@0.17.0-next.2 + - @backstage/plugin-search-common@1.2.0-next.2 + - example-app@0.2.78-next.2 + - @backstage/plugin-techdocs-backend@1.4.2-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.2 + - @backstage/backend-tasks@0.4.0-next.2 + - @backstage/plugin-auth-backend@0.17.2-next.2 + - @backstage/plugin-auth-node@0.2.8-next.2 + - @backstage/plugin-azure-sites-backend@0.1.1-next.2 + - @backstage/plugin-badges-backend@0.1.33-next.2 + - @backstage/plugin-code-coverage-backend@0.2.5-next.2 + - @backstage/plugin-explore-backend@0.0.1-next.1 + - @backstage/plugin-graphql-backend@0.1.29-next.2 + - @backstage/plugin-jenkins-backend@0.1.29-next.2 + - @backstage/plugin-kafka-backend@0.2.32-next.2 + - @backstage/plugin-kubernetes-backend@0.8.1-next.2 + - @backstage/plugin-permission-backend@0.5.14-next.2 + - @backstage/plugin-permission-node@0.7.2-next.2 + - @backstage/plugin-proxy-backend@0.2.33-next.2 + - @backstage/plugin-rollbar-backend@0.1.36-next.2 + - @backstage/plugin-tech-insights-backend@0.5.5-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.2 + - @backstage/plugin-tech-insights-node@0.3.7-next.2 + - @backstage/plugin-todo-backend@0.1.36-next.2 + - @backstage/catalog-client@1.2.0-next.1 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/integration@1.4.1-next.1 + - @backstage/plugin-events-node@0.2.0-next.2 + - @backstage/plugin-permission-common@0.7.2-next.1 + +## 0.2.78-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0-next.1 + - @backstage/plugin-catalog-backend@1.6.0-next.1 + - @backstage/plugin-kafka-backend@0.2.32-next.1 + - @backstage/backend-tasks@0.4.0-next.1 + - @backstage/plugin-search-backend-node@1.0.5-next.1 + - @backstage/plugin-jenkins-backend@0.1.29-next.1 + - @backstage/plugin-scaffolder-backend@1.8.1-next.1 + - @backstage/plugin-explore-backend@0.0.1-next.0 + - @backstage/plugin-proxy-backend@0.2.33-next.1 + - @backstage/plugin-app-backend@0.3.39-next.1 + - @backstage/plugin-auth-backend@0.17.2-next.1 + - @backstage/plugin-auth-node@0.2.8-next.1 + - @backstage/plugin-azure-devops-backend@0.3.18-next.1 + - @backstage/plugin-azure-sites-backend@0.1.1-next.1 + - @backstage/plugin-badges-backend@0.1.33-next.1 + - @backstage/plugin-catalog-node@1.2.2-next.1 + - @backstage/plugin-code-coverage-backend@0.2.5-next.1 + - @backstage/plugin-events-backend@0.2.0-next.1 + - @backstage/plugin-graphql-backend@0.1.29-next.1 + - @backstage/plugin-kubernetes-backend@0.8.1-next.1 + - @backstage/plugin-permission-backend@0.5.14-next.1 + - @backstage/plugin-permission-node@0.7.2-next.1 + - @backstage/plugin-playlist-backend@0.2.2-next.1 + - @backstage/plugin-rollbar-backend@0.1.36-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.1 + - @backstage/plugin-search-backend@1.1.2-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.5-next.1 + - @backstage/plugin-search-backend-module-pg@0.4.3-next.1 + - @backstage/plugin-tech-insights-backend@0.5.5-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.1 + - @backstage/plugin-tech-insights-node@0.3.7-next.1 + - @backstage/plugin-techdocs-backend@1.4.2-next.1 + - @backstage/plugin-todo-backend@0.1.36-next.1 + - example-app@0.2.78-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/integration@1.4.1-next.1 + - @backstage/catalog-client@1.2.0-next.1 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/plugin-events-node@0.2.0-next.1 + - @backstage/plugin-permission-common@0.7.2-next.1 + - @backstage/plugin-search-common@1.1.2-next.1 + +## 0.2.78-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.1-next.0 + - @backstage/catalog-client@1.2.0-next.0 + - @backstage/plugin-catalog-backend@1.6.0-next.0 + - @backstage/plugin-events-backend@0.2.0-next.0 + - @backstage/plugin-search-backend-node@1.0.5-next.0 + - @backstage/plugin-events-node@0.2.0-next.0 + - @backstage/backend-common@0.16.1-next.0 + - @backstage/integration@1.4.1-next.0 + - @backstage/plugin-app-backend@0.3.39-next.0 + - @backstage/plugin-auth-backend@0.17.2-next.0 + - @backstage/plugin-auth-node@0.2.8-next.0 + - @backstage/plugin-azure-devops-backend@0.3.18-next.0 + - @backstage/plugin-azure-sites-backend@0.1.1-next.0 + - @backstage/plugin-code-coverage-backend@0.2.5-next.0 + - @backstage/plugin-graphql-backend@0.1.29-next.0 + - @backstage/plugin-jenkins-backend@0.1.29-next.0 + - @backstage/plugin-permission-backend@0.5.14-next.0 + - @backstage/plugin-permission-common@0.7.2-next.0 + - @backstage/plugin-permission-node@0.7.2-next.0 + - @backstage/plugin-playlist-backend@0.2.2-next.0 + - @backstage/plugin-proxy-backend@0.2.33-next.0 + - @backstage/plugin-rollbar-backend@0.1.36-next.0 + - @backstage/plugin-techdocs-backend@1.4.2-next.0 + - @backstage/plugin-todo-backend@0.1.36-next.0 + - @backstage/plugin-kubernetes-backend@0.8.1-next.0 + - example-app@0.2.78-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.0 + - @backstage/plugin-badges-backend@0.1.33-next.0 + - @backstage/plugin-catalog-node@1.2.2-next.0 + - @backstage/plugin-tech-insights-backend@0.5.5-next.0 + - @backstage/backend-tasks@0.3.8-next.0 + - @backstage/catalog-model@1.1.4-next.0 + - @backstage/config@1.0.5-next.0 + - @backstage/plugin-kafka-backend@0.2.32-next.0 + - @backstage/plugin-search-backend@1.1.2-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.5-next.0 + - @backstage/plugin-search-backend-module-pg@0.4.3-next.0 + - @backstage/plugin-search-common@1.1.2-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.0 + - @backstage/plugin-tech-insights-node@0.3.7-next.0 + +## 0.2.77 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0 + - @backstage/plugin-auth-backend@0.17.1 + - @backstage/plugin-catalog-backend@1.5.1 + - @backstage/plugin-techdocs-backend@1.4.1 + - @backstage/plugin-scaffolder-backend@1.8.0 + - @backstage/integration@1.4.0 + - @backstage/backend-tasks@0.3.7 + - @backstage/plugin-playlist-backend@0.2.1 + - @backstage/plugin-azure-devops-backend@0.3.17 + - @backstage/catalog-model@1.1.3 + - @backstage/plugin-auth-node@0.2.7 + - @backstage/plugin-permission-common@0.7.1 + - @backstage/plugin-code-coverage-backend@0.2.4 + - @backstage/plugin-events-backend@0.1.0 + - @backstage/plugin-events-node@0.1.0 + - @backstage/plugin-kubernetes-backend@0.8.0 + - @backstage/plugin-tech-insights-backend@0.5.4 + - @backstage/plugin-tech-insights-node@0.3.6 + - @backstage/plugin-azure-sites-backend@0.1.0 + - example-app@0.2.77 + - @backstage/plugin-app-backend@0.3.38 + - @backstage/plugin-badges-backend@0.1.32 + - @backstage/plugin-catalog-node@1.2.1 + - @backstage/plugin-graphql-backend@0.1.28 + - @backstage/plugin-jenkins-backend@0.1.28 + - @backstage/plugin-kafka-backend@0.2.31 + - @backstage/plugin-permission-backend@0.5.13 + - @backstage/plugin-permission-node@0.7.1 + - @backstage/plugin-proxy-backend@0.2.32 + - @backstage/plugin-rollbar-backend@0.1.35 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.6 + - @backstage/plugin-search-backend@1.1.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.4 + - @backstage/plugin-search-backend-module-pg@0.4.2 + - @backstage/plugin-search-backend-node@1.0.4 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.22 + - @backstage/plugin-todo-backend@0.1.35 + - @backstage/catalog-client@1.1.2 + - @backstage/config@1.0.4 + - @backstage/plugin-search-common@1.1.1 + +## 0.2.77-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.17.1-next.1 + - @backstage/backend-common@0.16.0-next.1 + - @backstage/plugin-scaffolder-backend@1.8.0-next.2 + - @backstage/plugin-code-coverage-backend@0.2.4-next.1 + - @backstage/plugin-kubernetes-backend@0.8.0-next.1 + - @backstage/plugin-tech-insights-backend@0.5.4-next.1 + - example-app@0.2.77-next.2 + - @backstage/backend-tasks@0.3.7-next.1 + - @backstage/plugin-app-backend@0.3.38-next.1 + - @backstage/plugin-auth-node@0.2.7-next.1 + - @backstage/plugin-azure-devops-backend@0.3.17-next.2 + - @backstage/plugin-azure-sites-backend@0.1.0-next.1 + - @backstage/plugin-badges-backend@0.1.32-next.1 + - @backstage/plugin-catalog-backend@1.5.1-next.1 + - @backstage/plugin-graphql-backend@0.1.28-next.1 + - @backstage/plugin-jenkins-backend@0.1.28-next.1 + - @backstage/plugin-kafka-backend@0.2.31-next.1 + - @backstage/plugin-permission-backend@0.5.13-next.1 + - @backstage/plugin-permission-node@0.7.1-next.1 + - @backstage/plugin-playlist-backend@0.2.1-next.2 + - @backstage/plugin-proxy-backend@0.2.32-next.1 + - @backstage/plugin-rollbar-backend@0.1.35-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.6-next.2 + - @backstage/plugin-search-backend@1.1.1-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.4-next.1 + - @backstage/plugin-search-backend-module-pg@0.4.2-next.1 + - @backstage/plugin-search-backend-node@1.0.4-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.22-next.1 + - @backstage/plugin-tech-insights-node@0.3.6-next.1 + - @backstage/plugin-techdocs-backend@1.4.1-next.1 + - @backstage/plugin-todo-backend@0.1.35-next.1 + - @backstage/catalog-client@1.1.2-next.0 + - @backstage/catalog-model@1.1.3-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/integration@1.4.0-next.0 + - @backstage/plugin-permission-common@0.7.1-next.0 + - @backstage/plugin-search-common@1.1.1-next.0 + +## 0.2.77-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.1 + - @backstage/plugin-playlist-backend@0.2.1-next.1 + - @backstage/plugin-azure-devops-backend@0.3.17-next.1 + - example-app@0.2.77-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.6-next.1 + +## 0.2.77-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.0 + - @backstage/plugin-catalog-backend@1.5.1-next.0 + - @backstage/plugin-techdocs-backend@1.4.1-next.0 + - @backstage/plugin-scaffolder-backend@1.8.0-next.0 + - @backstage/integration@1.4.0-next.0 + - @backstage/plugin-auth-backend@0.17.1-next.0 + - @backstage/backend-tasks@0.3.7-next.0 + - @backstage/catalog-model@1.1.3-next.0 + - @backstage/plugin-auth-node@0.2.7-next.0 + - @backstage/plugin-permission-common@0.7.1-next.0 + - @backstage/plugin-tech-insights-backend@0.5.4-next.0 + - @backstage/plugin-tech-insights-node@0.3.6-next.0 + - @backstage/plugin-azure-sites-backend@0.1.0-next.0 + - @backstage/plugin-kubernetes-backend@0.8.0-next.0 + - example-app@0.2.77-next.0 + - @backstage/plugin-app-backend@0.3.38-next.0 + - @backstage/plugin-azure-devops-backend@0.3.17-next.0 + - @backstage/plugin-badges-backend@0.1.32-next.0 + - @backstage/plugin-code-coverage-backend@0.2.4-next.0 + - @backstage/plugin-graphql-backend@0.1.28-next.0 + - @backstage/plugin-jenkins-backend@0.1.28-next.0 + - @backstage/plugin-kafka-backend@0.2.31-next.0 + - @backstage/plugin-permission-backend@0.5.13-next.0 + - @backstage/plugin-permission-node@0.7.1-next.0 + - @backstage/plugin-playlist-backend@0.2.1-next.0 + - @backstage/plugin-proxy-backend@0.2.32-next.0 + - @backstage/plugin-rollbar-backend@0.1.35-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.6-next.0 + - @backstage/plugin-search-backend@1.1.1-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.4-next.0 + - @backstage/plugin-search-backend-module-pg@0.4.2-next.0 + - @backstage/plugin-search-backend-node@1.0.4-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.22-next.0 + - @backstage/plugin-todo-backend@0.1.35-next.0 + - @backstage/catalog-client@1.1.2-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/plugin-search-common@1.1.1-next.0 + +## 0.2.76 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.2 + - @backstage/backend-common@0.15.2 + - @backstage/plugin-catalog-backend@1.5.0 + - @backstage/plugin-scaffolder-backend@1.7.0 + - @backstage/plugin-auth-node@0.2.6 + - @backstage/backend-tasks@0.3.6 + - @backstage/plugin-permission-node@0.7.0 + - @backstage/plugin-auth-backend@0.17.0 + - @backstage/plugin-permission-common@0.7.0 + - @backstage/plugin-tech-insights-backend@0.5.3 + - @backstage/plugin-search-backend@1.1.0 + - @backstage/catalog-client@1.1.1 + - @backstage/plugin-playlist-backend@0.2.0 + - @backstage/plugin-jenkins-backend@0.1.27 + - @backstage/plugin-app-backend@0.3.37 + - @backstage/plugin-badges-backend@0.1.31 + - @backstage/plugin-graphql-backend@0.1.27 + - @backstage/plugin-permission-backend@0.5.12 + - @backstage/plugin-rollbar-backend@0.1.34 + - @backstage/plugin-kubernetes-backend@0.7.3 + - @backstage/plugin-search-common@1.1.0 + - @backstage/plugin-search-backend-node@1.0.3 + - @backstage/plugin-search-backend-module-pg@0.4.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.3 + - @backstage/plugin-techdocs-backend@1.4.0 + - @backstage/plugin-tech-insights-node@0.3.5 + - example-app@0.2.76 + - @backstage/plugin-code-coverage-backend@0.2.3 + - @backstage/plugin-kafka-backend@0.2.30 + - @backstage/plugin-todo-backend@0.1.34 + - @backstage/plugin-azure-devops-backend@0.3.16 + - @backstage/plugin-proxy-backend@0.2.31 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.5 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.21 + - @backstage/config@1.0.3 + - @backstage/integration@1.3.2 + +## 0.2.76-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.5.0-next.2 + - @backstage/backend-tasks@0.3.6-next.2 + - @backstage/backend-common@0.15.2-next.2 + - @backstage/plugin-permission-common@0.7.0-next.2 + - @backstage/plugin-permission-node@0.7.0-next.2 + - @backstage/plugin-scaffolder-backend@1.7.0-next.2 + - @backstage/plugin-playlist-backend@0.2.0-next.2 + - @backstage/plugin-badges-backend@0.1.31-next.2 + - @backstage/plugin-graphql-backend@0.1.27-next.2 + - @backstage/plugin-permission-backend@0.5.12-next.2 + - @backstage/plugin-rollbar-backend@0.1.34-next.2 + - @backstage/plugin-search-backend@1.1.0-next.2 + - @backstage/plugin-tech-insights-backend@0.5.3-next.2 + - @backstage/plugin-techdocs-backend@1.4.0-next.2 + - example-app@0.2.76-next.2 + - @backstage/plugin-search-backend-node@1.0.3-next.2 + - @backstage/plugin-tech-insights-node@0.3.5-next.2 + - @backstage/plugin-app-backend@0.3.37-next.2 + - @backstage/plugin-auth-backend@0.17.0-next.2 + - @backstage/plugin-auth-node@0.2.6-next.2 + - @backstage/plugin-azure-devops-backend@0.3.16-next.2 + - @backstage/plugin-code-coverage-backend@0.2.3-next.2 + - @backstage/plugin-jenkins-backend@0.1.27-next.2 + - @backstage/plugin-kafka-backend@0.2.30-next.2 + - @backstage/plugin-kubernetes-backend@0.7.3-next.2 + - @backstage/plugin-proxy-backend@0.2.31-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.5-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.3-next.2 + - @backstage/plugin-search-backend-module-pg@0.4.1-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.21-next.2 + - @backstage/plugin-todo-backend@0.1.34-next.2 + - @backstage/plugin-search-common@1.1.0-next.2 + - @backstage/catalog-client@1.1.1-next.2 + - @backstage/catalog-model@1.1.2-next.2 + - @backstage/config@1.0.3-next.2 + - @backstage/integration@1.3.2-next.2 + +## 0.2.76-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.17.0-next.1 + - @backstage/plugin-search-backend@1.1.0-next.1 + - @backstage/catalog-client@1.1.1-next.1 + - @backstage/backend-common@0.15.2-next.1 + - @backstage/plugin-scaffolder-backend@1.7.0-next.1 + - @backstage/plugin-search-common@1.1.0-next.1 + - @backstage/plugin-search-backend-node@1.0.3-next.1 + - @backstage/plugin-search-backend-module-pg@0.4.1-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.3-next.1 + - @backstage/plugin-kubernetes-backend@0.7.3-next.1 + - @backstage/plugin-tech-insights-backend@0.5.3-next.1 + - example-app@0.2.76-next.1 + - @backstage/backend-tasks@0.3.6-next.1 + - @backstage/catalog-model@1.1.2-next.1 + - @backstage/config@1.0.3-next.1 + - @backstage/integration@1.3.2-next.1 + - @backstage/plugin-app-backend@0.3.37-next.1 + - @backstage/plugin-auth-node@0.2.6-next.1 + - @backstage/plugin-azure-devops-backend@0.3.16-next.1 + - @backstage/plugin-badges-backend@0.1.31-next.1 + - @backstage/plugin-catalog-backend@1.4.1-next.1 + - @backstage/plugin-code-coverage-backend@0.2.3-next.1 + - @backstage/plugin-graphql-backend@0.1.27-next.1 + - @backstage/plugin-jenkins-backend@0.1.27-next.1 + - @backstage/plugin-kafka-backend@0.2.30-next.1 + - @backstage/plugin-permission-backend@0.5.12-next.1 + - @backstage/plugin-permission-common@0.6.5-next.1 + - @backstage/plugin-permission-node@0.6.6-next.1 + - @backstage/plugin-playlist-backend@0.1.1-next.1 + - @backstage/plugin-proxy-backend@0.2.31-next.1 + - @backstage/plugin-rollbar-backend@0.1.34-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.5-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.21-next.1 + - @backstage/plugin-tech-insights-node@0.3.5-next.1 + - @backstage/plugin-techdocs-backend@1.3.1-next.1 + - @backstage/plugin-todo-backend@0.1.34-next.1 + +## 0.2.76-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.2-next.0 + - @backstage/plugin-scaffolder-backend@1.7.0-next.0 + - @backstage/plugin-auth-backend@0.17.0-next.0 + - @backstage/plugin-catalog-backend@1.4.1-next.0 + - @backstage/plugin-jenkins-backend@0.1.27-next.0 + - @backstage/plugin-app-backend@0.3.37-next.0 + - @backstage/plugin-tech-insights-node@0.3.5-next.0 + - example-app@0.2.76-next.0 + - @backstage/catalog-client@1.1.1-next.0 + - @backstage/plugin-badges-backend@0.1.31-next.0 + - @backstage/plugin-code-coverage-backend@0.2.3-next.0 + - @backstage/plugin-kafka-backend@0.2.30-next.0 + - @backstage/plugin-kubernetes-backend@0.7.3-next.0 + - @backstage/plugin-playlist-backend@0.1.1-next.0 + - @backstage/plugin-tech-insights-backend@0.5.3-next.0 + - @backstage/plugin-techdocs-backend@1.3.1-next.0 + - @backstage/plugin-todo-backend@0.1.34-next.0 + - @backstage/backend-common@0.15.2-next.0 + - @backstage/backend-tasks@0.3.6-next.0 + - @backstage/plugin-auth-node@0.2.6-next.0 + - @backstage/plugin-permission-node@0.6.6-next.0 + - @backstage/plugin-rollbar-backend@0.1.34-next.0 + - @backstage/plugin-search-backend-module-pg@0.4.1-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.5-next.0 + - @backstage/config@1.0.3-next.0 + - @backstage/integration@1.3.2-next.0 + - @backstage/plugin-azure-devops-backend@0.3.16-next.0 + - @backstage/plugin-graphql-backend@0.1.27-next.0 + - @backstage/plugin-permission-backend@0.5.12-next.0 + - @backstage/plugin-permission-common@0.6.5-next.0 + - @backstage/plugin-proxy-backend@0.2.31-next.0 + - @backstage/plugin-search-backend@1.0.3-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.3-next.0 + - @backstage/plugin-search-backend-node@1.0.3-next.0 + - @backstage/plugin-search-common@1.0.2-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.21-next.0 + +## 0.2.75 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.1 + - @backstage/plugin-scaffolder-backend@1.6.0 + - @backstage/plugin-auth-node@0.2.5 + - @backstage/plugin-permission-node@0.6.5 + - @backstage/plugin-kubernetes-backend@0.7.2 + - @backstage/plugin-kafka-backend@0.2.29 + - @backstage/plugin-proxy-backend@0.2.30 + - @backstage/plugin-auth-backend@0.16.0 + - @backstage/integration@1.3.1 + - @backstage/plugin-catalog-backend@1.4.0 + - @backstage/plugin-azure-devops-backend@0.3.15 + - @backstage/plugin-search-backend-node@1.0.2 + - @backstage/plugin-tech-insights-node@0.3.4 + - @backstage/backend-tasks@0.3.5 + - @backstage/plugin-techdocs-backend@1.3.0 + - @backstage/catalog-client@1.1.0 + - @backstage/catalog-model@1.1.1 + - @backstage/config@1.0.2 + - @backstage/plugin-permission-common@0.6.4 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.4 + - @backstage/plugin-search-backend-module-pg@0.4.0 + - @backstage/plugin-jenkins-backend@0.1.26 + - @backstage/plugin-playlist-backend@0.1.0 + - @backstage/plugin-app-backend@0.3.36 + - @backstage/plugin-graphql-backend@0.1.26 + - @backstage/plugin-rollbar-backend@0.1.33 + - @backstage/plugin-code-coverage-backend@0.2.2 + - @backstage/plugin-permission-backend@0.5.11 + - @backstage/plugin-todo-backend@0.1.33 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.2 + - @backstage/plugin-tech-insights-backend@0.5.2 + - @backstage/plugin-badges-backend@0.1.30 + - example-app@0.2.75 + - @backstage/plugin-search-backend@1.0.2 + - @backstage/plugin-search-common@1.0.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.20 + +## 0.2.75-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.1.0-next.2 + - @backstage/catalog-model@1.1.1-next.0 + - @backstage/config@1.0.2-next.0 + - @backstage/integration@1.3.1-next.2 + - @backstage/plugin-permission-common@0.6.4-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.4-next.1 + - @backstage/plugin-catalog-backend@1.4.0-next.3 + - @backstage/plugin-auth-backend@0.16.0-next.3 + - @backstage/backend-common@0.15.1-next.3 + - @backstage/plugin-scaffolder-backend@1.6.0-next.3 + - @backstage/plugin-badges-backend@0.1.30-next.1 + - @backstage/plugin-code-coverage-backend@0.2.2-next.2 + - @backstage/plugin-jenkins-backend@0.1.26-next.3 + - @backstage/plugin-kubernetes-backend@0.7.2-next.3 + - @backstage/plugin-tech-insights-backend@0.5.2-next.2 + - @backstage/plugin-techdocs-backend@1.3.0-next.2 + - @backstage/plugin-todo-backend@0.1.33-next.2 + - example-app@0.2.75-next.3 + - @backstage/plugin-kafka-backend@0.2.29-next.1 + - @backstage/backend-tasks@0.3.5-next.1 + - @backstage/plugin-app-backend@0.3.36-next.3 + - @backstage/plugin-auth-node@0.2.5-next.3 + - @backstage/plugin-azure-devops-backend@0.3.15-next.2 + - @backstage/plugin-graphql-backend@0.1.26-next.3 + - @backstage/plugin-permission-backend@0.5.11-next.2 + - @backstage/plugin-permission-node@0.6.5-next.3 + - @backstage/plugin-proxy-backend@0.2.30-next.2 + - @backstage/plugin-rollbar-backend@0.1.33-next.3 + - @backstage/plugin-search-backend@1.0.2-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.2-next.2 + - @backstage/plugin-search-backend-module-pg@0.4.0-next.2 + - @backstage/plugin-search-backend-node@1.0.2-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.20-next.1 + - @backstage/plugin-tech-insights-node@0.3.4-next.1 + +## 0.2.75-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.7.2-next.2 + - @backstage/backend-common@0.15.1-next.2 + - @backstage/integration@1.3.1-next.1 + - @backstage/plugin-catalog-backend@1.4.0-next.2 + - @backstage/plugin-scaffolder-backend@1.6.0-next.2 + - @backstage/plugin-auth-node@0.2.5-next.2 + - @backstage/plugin-techdocs-backend@1.3.0-next.1 + - @backstage/plugin-jenkins-backend@0.1.26-next.2 + - @backstage/catalog-client@1.0.5-next.1 + - @backstage/plugin-app-backend@0.3.36-next.2 + - @backstage/plugin-auth-backend@0.16.0-next.2 + - @backstage/plugin-azure-devops-backend@0.3.15-next.1 + - @backstage/plugin-code-coverage-backend@0.2.2-next.1 + - @backstage/plugin-graphql-backend@0.1.26-next.2 + - @backstage/plugin-permission-backend@0.5.11-next.1 + - @backstage/plugin-permission-common@0.6.4-next.1 + - @backstage/plugin-permission-node@0.6.5-next.2 + - @backstage/plugin-proxy-backend@0.2.30-next.1 + - @backstage/plugin-rollbar-backend@0.1.33-next.2 + - @backstage/plugin-todo-backend@0.1.33-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.2-next.1 + - example-app@0.2.75-next.2 + +## 0.2.75-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.5-next.1 + - @backstage/plugin-permission-node@0.6.5-next.1 + - @backstage/backend-common@0.15.1-next.1 + - @backstage/plugin-catalog-backend@1.4.0-next.1 + - @backstage/plugin-auth-backend@0.16.0-next.1 + - @backstage/plugin-scaffolder-backend@1.6.0-next.1 + - @backstage/plugin-search-backend-node@1.0.2-next.1 + - @backstage/plugin-app-backend@0.3.36-next.1 + - @backstage/plugin-graphql-backend@0.1.26-next.1 + - @backstage/plugin-jenkins-backend@0.1.26-next.1 + - @backstage/plugin-rollbar-backend@0.1.33-next.1 + - @backstage/plugin-search-backend-module-pg@0.4.0-next.1 + - @backstage/plugin-kubernetes-backend@0.7.2-next.1 + - @backstage/plugin-tech-insights-backend@0.5.2-next.1 + - example-app@0.2.75-next.1 + +## 0.2.75-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.1-next.0 + - @backstage/plugin-scaffolder-backend@1.6.0-next.0 + - @backstage/plugin-kafka-backend@0.2.29-next.0 + - @backstage/plugin-proxy-backend@0.2.30-next.0 + - @backstage/plugin-azure-devops-backend@0.3.15-next.0 + - @backstage/plugin-search-backend-node@1.0.2-next.0 + - @backstage/plugin-tech-insights-node@0.3.4-next.0 + - @backstage/backend-tasks@0.3.5-next.0 + - @backstage/plugin-catalog-backend@1.3.2-next.0 + - @backstage/plugin-search-backend-module-pg@0.4.0-next.0 + - @backstage/catalog-client@1.0.5-next.0 + - @backstage/integration@1.3.1-next.0 + - @backstage/plugin-app-backend@0.3.36-next.0 + - @backstage/plugin-auth-backend@0.15.2-next.0 + - @backstage/plugin-auth-node@0.2.5-next.0 + - @backstage/plugin-code-coverage-backend@0.2.2-next.0 + - @backstage/plugin-graphql-backend@0.1.26-next.0 + - @backstage/plugin-jenkins-backend@0.1.26-next.0 + - @backstage/plugin-permission-backend@0.5.11-next.0 + - @backstage/plugin-permission-common@0.6.4-next.0 + - @backstage/plugin-permission-node@0.6.5-next.0 + - @backstage/plugin-rollbar-backend@0.1.33-next.0 + - @backstage/plugin-techdocs-backend@1.2.2-next.0 + - @backstage/plugin-todo-backend@0.1.33-next.0 + - @backstage/plugin-tech-insights-backend@0.5.2-next.0 + - @backstage/plugin-badges-backend@0.1.30-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.2-next.0 + - @backstage/plugin-kubernetes-backend@0.7.2-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.4-next.0 + - @backstage/plugin-search-backend@1.0.2-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.20-next.0 + - example-app@0.2.75-next.0 + - @backstage/plugin-search-common@1.0.1-next.0 + +## 0.2.74 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0 + - @backstage/plugin-kubernetes-backend@0.7.1 + - @backstage/integration@1.3.0 + - @backstage/plugin-scaffolder-backend@1.5.0 + - @backstage/plugin-auth-backend@0.15.1 + - @backstage/plugin-graphql-backend@0.1.25 + - @backstage/backend-tasks@0.3.4 + - @backstage/plugin-tech-insights-node@0.3.3 + - @backstage/plugin-catalog-backend@1.3.1 + - example-app@0.2.74 + - @backstage/plugin-app-backend@0.3.35 + - @backstage/plugin-auth-node@0.2.4 + - @backstage/plugin-azure-devops-backend@0.3.14 + - @backstage/plugin-badges-backend@0.1.29 + - @backstage/plugin-code-coverage-backend@0.2.1 + - @backstage/plugin-jenkins-backend@0.1.25 + - @backstage/plugin-kafka-backend@0.2.28 + - @backstage/plugin-permission-backend@0.5.10 + - @backstage/plugin-permission-node@0.6.4 + - @backstage/plugin-proxy-backend@0.2.29 + - @backstage/plugin-rollbar-backend@0.1.32 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.3 + - @backstage/plugin-search-backend@1.0.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.1 + - @backstage/plugin-search-backend-module-pg@0.3.6 + - @backstage/plugin-search-backend-node@1.0.1 + - @backstage/plugin-tech-insights-backend@0.5.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.19 + - @backstage/plugin-techdocs-backend@1.2.1 + - @backstage/plugin-todo-backend@0.1.32 + +## 0.2.74-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0-next.0 + - @backstage/integration@1.3.0-next.0 + - @backstage/plugin-scaffolder-backend@1.5.0-next.0 + - @backstage/backend-tasks@0.3.4-next.0 + - @backstage/plugin-kubernetes-backend@0.7.1-next.0 + - @backstage/plugin-tech-insights-node@0.3.3-next.0 + - @backstage/plugin-app-backend@0.3.35-next.0 + - @backstage/plugin-auth-backend@0.15.1-next.0 + - @backstage/plugin-auth-node@0.2.4-next.0 + - @backstage/plugin-azure-devops-backend@0.3.14-next.0 + - @backstage/plugin-badges-backend@0.1.29-next.0 + - @backstage/plugin-catalog-backend@1.3.1-next.0 + - @backstage/plugin-code-coverage-backend@0.2.1-next.0 + - @backstage/plugin-graphql-backend@0.1.25-next.0 + - @backstage/plugin-jenkins-backend@0.1.25-next.0 + - @backstage/plugin-kafka-backend@0.2.28-next.0 + - @backstage/plugin-permission-backend@0.5.10-next.0 + - @backstage/plugin-permission-node@0.6.4-next.0 + - @backstage/plugin-proxy-backend@0.2.29-next.0 + - @backstage/plugin-rollbar-backend@0.1.32-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.3-next.0 + - @backstage/plugin-search-backend@1.0.1-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.1-next.0 + - @backstage/plugin-search-backend-module-pg@0.3.6-next.0 + - @backstage/plugin-search-backend-node@1.0.1-next.0 + - @backstage/plugin-tech-insights-backend@0.5.1-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.19-next.0 + - @backstage/plugin-techdocs-backend@1.2.1-next.0 + - @backstage/plugin-todo-backend@0.1.32-next.0 + - example-app@0.2.74-next.0 + +## 0.2.73 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-code-coverage-backend@0.2.0 + - @backstage/plugin-catalog-backend@1.3.0 + - @backstage/plugin-tech-insights-backend@0.5.0 + - @backstage/backend-common@0.14.1 + - @backstage/catalog-model@1.1.0 + - @backstage/plugin-kubernetes-backend@0.7.0 + - @backstage/plugin-search-backend@1.0.0 + - @backstage/plugin-search-backend-node@1.0.0 + - @backstage/plugin-search-common@1.0.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.0.0 + - @backstage/plugin-scaffolder-backend@1.4.0 + - @backstage/plugin-auth-backend@0.15.0 + - @backstage/plugin-jenkins-backend@0.1.24 + - @backstage/plugin-proxy-backend@0.2.28 + - @backstage/plugin-search-backend-module-pg@0.3.5 + - @backstage/integration@1.2.2 + - @backstage/catalog-client@1.0.4 + - @backstage/plugin-app-backend@0.3.34 + - @backstage/plugin-auth-node@0.2.3 + - @backstage/plugin-azure-devops-backend@0.3.13 + - @backstage/plugin-graphql-backend@0.1.24 + - @backstage/plugin-permission-backend@0.5.9 + - @backstage/plugin-permission-common@0.6.3 + - @backstage/plugin-permission-node@0.6.3 + - @backstage/plugin-rollbar-backend@0.1.31 + - @backstage/plugin-techdocs-backend@1.2.0 + - @backstage/plugin-todo-backend@0.1.31 + - @backstage/backend-tasks@0.3.3 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.18 + - @backstage/plugin-tech-insights-node@0.3.2 + - @backstage/plugin-kafka-backend@0.2.27 + - @backstage/plugin-badges-backend@0.1.28 + - example-app@0.2.73 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.2 + +## 0.2.73-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-code-coverage-backend@0.2.0-next.3 + - @backstage/plugin-catalog-backend@1.3.0-next.3 + - @backstage/plugin-kubernetes-backend@0.7.0-next.3 + - @backstage/plugin-proxy-backend@0.2.28-next.1 + - @backstage/backend-common@0.14.1-next.3 + - @backstage/plugin-scaffolder-backend@1.4.0-next.3 + - @backstage/catalog-client@1.0.4-next.2 + - @backstage/integration@1.2.2-next.3 + - @backstage/plugin-app-backend@0.3.34-next.3 + - @backstage/plugin-auth-backend@0.15.0-next.3 + - @backstage/plugin-auth-node@0.2.3-next.2 + - @backstage/plugin-azure-devops-backend@0.3.13-next.1 + - @backstage/plugin-graphql-backend@0.1.24-next.1 + - @backstage/plugin-jenkins-backend@0.1.24-next.3 + - @backstage/plugin-permission-backend@0.5.9-next.2 + - @backstage/plugin-permission-common@0.6.3-next.1 + - @backstage/plugin-permission-node@0.6.3-next.2 + - @backstage/plugin-rollbar-backend@0.1.31-next.1 + - @backstage/plugin-techdocs-backend@1.2.0-next.3 + - @backstage/plugin-todo-backend@0.1.31-next.2 + - @backstage/backend-tasks@0.3.3-next.3 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.18-next.2 + - @backstage/plugin-tech-insights-backend@0.5.0-next.3 + - @backstage/plugin-tech-insights-node@0.3.2-next.1 + - @backstage/catalog-model@1.1.0-next.3 + - @backstage/plugin-search-backend-module-elasticsearch@0.2.0-next.2 + - @backstage/plugin-search-backend-node@0.6.3-next.2 + - @backstage/plugin-search-backend@0.5.4-next.2 + - example-app@0.2.73-next.3 + +## 0.2.73-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.7.0-next.2 + - @backstage/plugin-tech-insights-backend@0.5.0-next.2 + - @backstage/plugin-jenkins-backend@0.1.24-next.2 + - @backstage/plugin-search-backend-module-pg@0.3.5-next.2 + - @backstage/plugin-scaffolder-backend@1.4.0-next.2 + - @backstage/plugin-auth-backend@0.15.0-next.2 + - @backstage/catalog-model@1.1.0-next.2 + - @backstage/plugin-kafka-backend@0.2.27-next.2 + - @backstage/backend-common@0.14.1-next.2 + - @backstage/backend-tasks@0.3.3-next.2 + - @backstage/plugin-app-backend@0.3.34-next.2 + - @backstage/plugin-catalog-backend@1.2.1-next.2 + - @backstage/plugin-code-coverage-backend@0.1.32-next.2 + - @backstage/plugin-techdocs-backend@1.2.0-next.2 + - @backstage/plugin-badges-backend@0.1.28-next.2 + - @backstage/integration@1.2.2-next.2 + - example-app@0.2.73-next.2 + +## 0.2.73-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.4.0-next.1 + - @backstage/plugin-auth-backend@0.15.0-next.1 + - @backstage/catalog-model@1.1.0-next.1 + - @backstage/backend-common@0.14.1-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@0.2.0-next.1 + - @backstage/plugin-catalog-backend@1.2.1-next.1 + - @backstage/plugin-techdocs-backend@1.2.0-next.1 + - example-app@0.2.73-next.1 + - @backstage/backend-tasks@0.3.3-next.1 + - @backstage/catalog-client@1.0.4-next.1 + - @backstage/integration@1.2.2-next.1 + - @backstage/plugin-app-backend@0.3.34-next.1 + - @backstage/plugin-auth-node@0.2.3-next.1 + - @backstage/plugin-badges-backend@0.1.28-next.1 + - @backstage/plugin-code-coverage-backend@0.1.32-next.1 + - @backstage/plugin-jenkins-backend@0.1.24-next.1 + - @backstage/plugin-kafka-backend@0.2.27-next.1 + - @backstage/plugin-kubernetes-backend@0.7.0-next.1 + - @backstage/plugin-permission-backend@0.5.9-next.1 + - @backstage/plugin-permission-common@0.6.3-next.0 + - @backstage/plugin-permission-node@0.6.3-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.2-next.1 + - @backstage/plugin-search-backend@0.5.4-next.1 + - @backstage/plugin-search-backend-module-pg@0.3.5-next.1 + - @backstage/plugin-search-backend-node@0.6.3-next.1 + - @backstage/plugin-tech-insights-backend@0.4.2-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.18-next.1 + - @backstage/plugin-todo-backend@0.1.31-next.1 + +## 0.2.73-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-insights-backend@0.4.2-next.0 + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-scaffolder-backend@1.4.0-next.0 + - @backstage/plugin-auth-backend@0.14.2-next.0 + - @backstage/plugin-kubernetes-backend@0.7.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-azure-devops-backend@0.3.13-next.0 + - example-app@0.2.73-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-app-backend@0.3.34-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/plugin-badges-backend@0.1.28-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + - @backstage/plugin-code-coverage-backend@0.1.32-next.0 + - @backstage/plugin-graphql-backend@0.1.24-next.0 + - @backstage/plugin-jenkins-backend@0.1.24-next.0 + - @backstage/plugin-kafka-backend@0.2.27-next.0 + - @backstage/plugin-permission-backend@0.5.9-next.0 + - @backstage/plugin-permission-node@0.6.3-next.0 + - @backstage/plugin-proxy-backend@0.2.28-next.0 + - @backstage/plugin-rollbar-backend@0.1.31-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.2-next.0 + - @backstage/plugin-search-backend@0.5.4-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.6-next.0 + - @backstage/plugin-search-backend-module-pg@0.3.5-next.0 + - @backstage/plugin-search-backend-node@0.6.3-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.18-next.0 + - @backstage/plugin-tech-insights-node@0.3.2-next.0 + - @backstage/plugin-techdocs-backend@1.1.3-next.0 + - @backstage/plugin-todo-backend@0.1.31-next.0 + - @backstage/catalog-client@1.0.4-next.0 + +## 0.2.72 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-insights-backend@0.4.1 + - @backstage/plugin-catalog-backend@1.2.0 + - @backstage/plugin-auth-backend@0.14.1 + - @backstage/plugin-scaffolder-backend@1.3.0 + - @backstage/backend-tasks@0.3.2 + - @backstage/plugin-permission-node@0.6.2 + - @backstage/plugin-kubernetes-backend@0.6.0 + - @backstage/backend-common@0.14.0 + - @backstage/plugin-search-backend@0.5.3 + - @backstage/plugin-auth-node@0.2.2 + - @backstage/integration@1.2.1 + - @backstage/plugin-jenkins-backend@0.1.23 + - @backstage/plugin-search-backend-node@0.6.2 + - @backstage/catalog-client@1.0.3 + - @backstage/plugin-app-backend@0.3.33 + - @backstage/plugin-azure-devops-backend@0.3.12 + - @backstage/plugin-code-coverage-backend@0.1.31 + - @backstage/plugin-graphql-backend@0.1.23 + - @backstage/plugin-permission-backend@0.5.8 + - @backstage/plugin-permission-common@0.6.2 + - @backstage/plugin-rollbar-backend@0.1.30 + - @backstage/plugin-techdocs-backend@1.1.2 + - @backstage/plugin-todo-backend@0.1.30 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.5 + - @backstage/plugin-search-backend-module-pg@0.3.4 + - @backstage/catalog-model@1.0.3 + - @backstage/plugin-tech-insights-node@0.3.1 + - example-app@0.2.72 + - @backstage/plugin-badges-backend@0.1.27 + - @backstage/plugin-kafka-backend@0.2.26 + - @backstage/plugin-proxy-backend@0.2.27 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17 + +## 0.2.72-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.3.0-next.2 + - @backstage/backend-common@0.14.0-next.2 + - @backstage/plugin-search-backend@0.5.3-next.2 + - @backstage/plugin-auth-backend@0.14.1-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.2 + - @backstage/integration@1.2.1-next.2 + - @backstage/plugin-techdocs-backend@1.1.2-next.2 + - @backstage/plugin-search-backend-node@0.6.2-next.2 + - example-app@0.2.72-next.2 + - @backstage/backend-tasks@0.3.2-next.2 + - @backstage/plugin-app-backend@0.3.33-next.2 + - @backstage/plugin-auth-node@0.2.2-next.2 + - @backstage/plugin-azure-devops-backend@0.3.12-next.2 + - @backstage/plugin-badges-backend@0.1.27-next.2 + - @backstage/plugin-catalog-backend@1.2.0-next.2 + - @backstage/plugin-code-coverage-backend@0.1.31-next.2 + - @backstage/plugin-graphql-backend@0.1.23-next.2 + - @backstage/plugin-jenkins-backend@0.1.23-next.2 + - @backstage/plugin-kafka-backend@0.2.26-next.2 + - @backstage/plugin-kubernetes-backend@0.6.0-next.2 + - @backstage/plugin-permission-backend@0.5.8-next.2 + - @backstage/plugin-permission-node@0.6.2-next.2 + - @backstage/plugin-proxy-backend@0.2.27-next.1 + - @backstage/plugin-rollbar-backend@0.1.30-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.1-next.1 + - @backstage/plugin-search-backend-module-pg@0.3.4-next.2 + - @backstage/plugin-tech-insights-backend@0.4.1-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17-next.1 + - @backstage/plugin-tech-insights-node@0.3.1-next.1 + - @backstage/plugin-todo-backend@0.1.30-next.2 + +## 0.2.72-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-insights-backend@0.4.1-next.1 + - @backstage/plugin-auth-backend@0.14.1-next.1 + - @backstage/plugin-jenkins-backend@0.1.23-next.1 + - @backstage/backend-tasks@0.3.2-next.1 + - @backstage/backend-common@0.13.6-next.1 + - @backstage/catalog-client@1.0.3-next.0 + - @backstage/integration@1.2.1-next.1 + - @backstage/plugin-app-backend@0.3.33-next.1 + - @backstage/plugin-auth-node@0.2.2-next.1 + - @backstage/plugin-azure-devops-backend@0.3.12-next.1 + - @backstage/plugin-catalog-backend@1.2.0-next.1 + - @backstage/plugin-code-coverage-backend@0.1.31-next.1 + - @backstage/plugin-graphql-backend@0.1.23-next.1 + - @backstage/plugin-permission-backend@0.5.8-next.1 + - @backstage/plugin-permission-common@0.6.2-next.0 + - @backstage/plugin-permission-node@0.6.2-next.1 + - @backstage/plugin-rollbar-backend@0.1.30-next.1 + - @backstage/plugin-scaffolder-backend@1.3.0-next.1 + - @backstage/plugin-techdocs-backend@1.1.2-next.1 + - @backstage/plugin-todo-backend@0.1.30-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.1 + - @backstage/plugin-search-backend-node@0.6.2-next.1 + - @backstage/catalog-model@1.0.3-next.0 + - @backstage/plugin-badges-backend@0.1.27-next.1 + - example-app@0.2.72-next.1 + - @backstage/plugin-search-backend@0.5.3-next.1 + - @backstage/plugin-kafka-backend@0.2.26-next.1 + - @backstage/plugin-kubernetes-backend@0.6.0-next.1 + - @backstage/plugin-search-backend-module-pg@0.3.4-next.1 + +## 0.2.72-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.3.2-next.0 + - @backstage/plugin-scaffolder-backend@1.3.0-next.0 + - @backstage/plugin-kubernetes-backend@0.6.0-next.0 + - @backstage/backend-common@0.13.6-next.0 + - @backstage/plugin-auth-backend@0.14.1-next.0 + - @backstage/integration@1.2.1-next.0 + - @backstage/plugin-search-backend-node@0.6.2-next.0 + - @backstage/plugin-catalog-backend@1.2.0-next.0 + - @backstage/plugin-auth-node@0.2.2-next.0 + - @backstage/plugin-techdocs-backend@1.1.2-next.0 + - example-app@0.2.72-next.0 + - @backstage/plugin-app-backend@0.3.33-next.0 + - @backstage/plugin-azure-devops-backend@0.3.12-next.0 + - @backstage/plugin-badges-backend@0.1.27-next.0 + - @backstage/plugin-code-coverage-backend@0.1.31-next.0 + - @backstage/plugin-graphql-backend@0.1.23-next.0 + - @backstage/plugin-jenkins-backend@0.1.23-next.0 + - @backstage/plugin-kafka-backend@0.2.26-next.0 + - @backstage/plugin-permission-backend@0.5.8-next.0 + - @backstage/plugin-permission-node@0.6.2-next.0 + - @backstage/plugin-proxy-backend@0.2.27-next.0 + - @backstage/plugin-rollbar-backend@0.1.30-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.1-next.0 + - @backstage/plugin-search-backend@0.5.3-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.0 + - @backstage/plugin-search-backend-module-pg@0.3.4-next.0 + - @backstage/plugin-tech-insights-backend@0.4.1-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17-next.0 + - @backstage/plugin-tech-insights-node@0.3.1-next.0 + - @backstage/plugin-todo-backend@0.1.30-next.0 + +## 0.2.71 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3 + - @backstage/plugin-auth-backend@0.14.0 + - @backstage/plugin-kubernetes-backend@0.5.1 + - @backstage/plugin-catalog-backend@1.1.2 + - @backstage/plugin-tech-insights-backend@0.4.0 + - @backstage/plugin-scaffolder-backend@1.2.0 + - @backstage/backend-tasks@0.3.1 + - @backstage/integration@1.2.0 + - @backstage/plugin-tech-insights-node@0.3.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16 + - @backstage/plugin-rollbar-backend@0.1.29 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.4 + - @backstage/config@1.0.1 + - @backstage/plugin-app-backend@0.3.32 + - @backstage/plugin-techdocs-backend@1.1.1 + - @backstage/plugin-search-backend-node@0.6.1 + - @backstage/plugin-search-backend-module-pg@0.3.3 + - @backstage/plugin-jenkins-backend@0.1.22 + - @backstage/plugin-search-backend@0.5.2 + - @backstage/plugin-auth-node@0.2.1 + - @backstage/plugin-azure-devops-backend@0.3.11 + - example-app@0.2.71 + - @backstage/catalog-client@1.0.2 + - @backstage/catalog-model@1.0.2 + - @backstage/plugin-badges-backend@0.1.26 + - @backstage/plugin-code-coverage-backend@0.1.30 + - @backstage/plugin-graphql-backend@0.1.22 + - @backstage/plugin-kafka-backend@0.2.25 + - @backstage/plugin-permission-backend@0.5.7 + - @backstage/plugin-permission-common@0.6.1 + - @backstage/plugin-permission-node@0.6.1 + - @backstage/plugin-proxy-backend@0.2.26 + - @backstage/plugin-todo-backend@0.1.29 + +## 0.2.71-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/plugin-kubernetes-backend@0.5.1-next.1 + - @backstage/plugin-catalog-backend@1.1.2-next.2 + - @backstage/backend-tasks@0.3.1-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.0-next.1 + - @backstage/plugin-scaffolder-backend@1.2.0-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-backend-node@0.6.1-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.4-next.1 + - @backstage/plugin-search-backend-module-pg@0.3.3-next.1 + - @backstage/plugin-azure-devops-backend@0.3.11-next.1 + - example-app@0.2.71-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/integration@1.2.0-next.1 + - @backstage/plugin-app-backend@0.3.32-next.1 + - @backstage/plugin-auth-backend@0.13.1-next.2 + - @backstage/plugin-auth-node@0.2.1-next.1 + - @backstage/plugin-badges-backend@0.1.26-next.1 + - @backstage/plugin-code-coverage-backend@0.1.30-next.1 + - @backstage/plugin-graphql-backend@0.1.22-next.1 + - @backstage/plugin-jenkins-backend@0.1.22-next.1 + - @backstage/plugin-kafka-backend@0.2.25-next.1 + - @backstage/plugin-permission-backend@0.5.7-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/plugin-permission-node@0.6.1-next.1 + - @backstage/plugin-proxy-backend@0.2.26-next.1 + - @backstage/plugin-rollbar-backend@0.1.29-next.2 + - @backstage/plugin-search-backend@0.5.2-next.1 + - @backstage/plugin-tech-insights-backend@0.4.0-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16-next.2 + - @backstage/plugin-tech-insights-node@0.3.0-next.2 + - @backstage/plugin-techdocs-backend@1.1.1-next.1 + - @backstage/plugin-todo-backend@0.1.29-next.1 + - @backstage/catalog-client@1.0.2-next.0 + +## 0.2.71-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.13.1-next.1 + - @backstage/plugin-tech-insights-backend@0.4.0-next.1 + - @backstage/backend-common@0.13.3-next.1 + - @backstage/plugin-tech-insights-node@0.3.0-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16-next.1 + - @backstage/plugin-catalog-backend@1.1.2-next.1 + - @backstage/plugin-rollbar-backend@0.1.29-next.1 + - example-app@0.2.71-next.1 + +## 0.2.71-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.0 + - @backstage/plugin-scaffolder-backend@1.2.0-next.0 + - @backstage/plugin-kubernetes-backend@0.5.1-next.0 + - @backstage/integration@1.2.0-next.0 + - @backstage/plugin-catalog-backend@1.1.2-next.0 + - @backstage/plugin-app-backend@0.3.32-next.0 + - @backstage/plugin-auth-backend@0.13.1-next.0 + - @backstage/plugin-rollbar-backend@0.1.29-next.0 + - @backstage/plugin-techdocs-backend@1.1.1-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.4-next.0 + - @backstage/plugin-jenkins-backend@0.1.22-next.0 + - @backstage/plugin-search-backend@0.5.2-next.0 + - @backstage/backend-tasks@0.3.1-next.0 + - @backstage/plugin-auth-node@0.2.1-next.0 + - example-app@0.2.71-next.0 + - @backstage/plugin-azure-devops-backend@0.3.11-next.0 + - @backstage/plugin-badges-backend@0.1.26-next.0 + - @backstage/plugin-code-coverage-backend@0.1.30-next.0 + - @backstage/plugin-graphql-backend@0.1.22-next.0 + - @backstage/plugin-kafka-backend@0.2.25-next.0 + - @backstage/plugin-permission-backend@0.5.7-next.0 + - @backstage/plugin-permission-node@0.6.1-next.0 + - @backstage/plugin-proxy-backend@0.2.26-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.3.7-next.0 + - @backstage/plugin-search-backend-module-pg@0.3.3-next.0 + - @backstage/plugin-search-backend-node@0.6.1-next.0 + - @backstage/plugin-tech-insights-backend@0.3.1-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16-next.0 + - @backstage/plugin-tech-insights-node@0.2.10-next.0 + - @backstage/plugin-todo-backend@0.1.29-next.0 + +## 0.2.70 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.1.0 + - @backstage/plugin-techdocs-backend@1.1.0 + - @backstage/plugin-scaffolder-backend@1.1.0 + - @backstage/integration@1.1.0 + - @backstage/plugin-search-backend@0.5.0 + - @backstage/plugin-auth-backend@0.13.0 + - @backstage/backend-tasks@0.3.0 + - @backstage/plugin-permission-common@0.6.0 + - @backstage/plugin-permission-node@0.6.0 + - @backstage/catalog-model@1.0.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.15 + - @backstage/plugin-kafka-backend@0.2.24 + - @backstage/plugin-auth-node@0.2.0 + - @backstage/plugin-jenkins-backend@0.1.20 + - @backstage/plugin-badges-backend@0.1.25 + - @backstage/plugin-tech-insights-node@0.2.9 + - @backstage/plugin-todo-backend@0.1.28 + - @backstage/backend-common@0.13.2 + - @backstage/plugin-kubernetes-backend@0.5.0 + - @backstage/plugin-search-backend-node@0.6.0 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.3 + - @backstage/plugin-search-backend-module-pg@0.3.2 + - @backstage/plugin-permission-backend@0.5.6 + - @backstage/plugin-tech-insights-backend@0.3.0 + - @backstage/plugin-azure-devops-backend@0.3.10 + - @backstage/plugin-scaffolder-backend-module-rails@0.3.6 + - example-app@0.2.70 + - @backstage/catalog-client@1.0.1 + - @backstage/plugin-app-backend@0.3.31 + - @backstage/plugin-code-coverage-backend@0.1.29 + - @backstage/plugin-graphql-backend@0.1.21 + - @backstage/plugin-proxy-backend@0.2.25 + - @backstage/plugin-rollbar-backend@0.1.28 + +## 0.2.70-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.13.0-next.2 + - @backstage/plugin-catalog-backend@1.1.0-next.3 + - @backstage/plugin-kafka-backend@0.2.24-next.1 + - @backstage/plugin-search-backend@0.5.0-next.2 + - @backstage/plugin-permission-common@0.6.0-next.1 + - @backstage/plugin-permission-node@0.6.0-next.2 + - @backstage/plugin-jenkins-backend@0.1.20-next.2 + - @backstage/plugin-todo-backend@0.1.28-next.2 + - @backstage/backend-common@0.13.2-next.2 + - @backstage/plugin-kubernetes-backend@0.5.0-next.1 + - @backstage/plugin-search-backend-node@0.6.0-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.3.6-next.2 + - @backstage/integration@1.1.0-next.2 + - @backstage/plugin-techdocs-backend@1.1.0-next.2 + - example-app@0.2.70-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.3-next.1 + - @backstage/plugin-search-backend-module-pg@0.3.2-next.1 + - @backstage/plugin-app-backend@0.3.31-next.1 + +## 0.2.70-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.1.0-next.1 + - @backstage/plugin-techdocs-backend@1.0.1-next.1 + - @backstage/plugin-scaffolder-backend@1.1.0-next.1 + - @backstage/integration@1.1.0-next.1 + - @backstage/plugin-search-backend@0.5.0-next.1 + - @backstage/backend-tasks@0.3.0-next.1 + - @backstage/plugin-permission-common@0.6.0-next.0 + - @backstage/plugin-permission-node@0.6.0-next.1 + - @backstage/plugin-badges-backend@0.1.25-next.1 + - @backstage/plugin-tech-insights-node@0.2.9-next.1 + - @backstage/plugin-permission-backend@0.5.6-next.1 + - @backstage/backend-common@0.13.2-next.1 + - @backstage/plugin-auth-backend@0.13.0-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.15-next.1 + - @backstage/plugin-tech-insights-backend@0.3.0-next.1 + - @backstage/plugin-jenkins-backend@0.1.20-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.3.6-next.1 + - @backstage/plugin-code-coverage-backend@0.1.29-next.1 + - @backstage/plugin-todo-backend@0.1.28-next.1 + - example-app@0.2.70-next.1 + +## 0.2.70-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.0.1-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.15-next.0 + - @backstage/plugin-search-backend@0.5.0-next.0 + - @backstage/plugin-auth-node@0.2.0-next.0 + - @backstage/plugin-auth-backend@0.13.0-next.0 + - @backstage/plugin-catalog-backend@1.0.1-next.0 + - @backstage/plugin-search-backend-node@0.5.3-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.3-next.0 + - @backstage/plugin-search-backend-module-pg@0.3.2-next.0 + - @backstage/backend-common@0.13.2-next.0 + - @backstage/integration@1.0.1-next.0 + - @backstage/plugin-tech-insights-backend@0.2.11-next.0 + - @backstage/plugin-techdocs-backend@1.0.1-next.0 + - @backstage/plugin-jenkins-backend@0.1.20-next.0 + - example-app@0.2.70-next.0 + - @backstage/catalog-client@1.0.1-next.0 + - @backstage/plugin-badges-backend@0.1.25-next.0 + - @backstage/plugin-code-coverage-backend@0.1.29-next.0 + - @backstage/plugin-kafka-backend@0.2.24-next.0 + - @backstage/plugin-kubernetes-backend@0.4.14-next.0 + - @backstage/plugin-scaffolder-backend@1.0.1-next.0 + - @backstage/plugin-todo-backend@0.1.28-next.0 + - @backstage/plugin-app-backend@0.3.31-next.0 + - @backstage/plugin-permission-backend@0.5.6-next.0 + - @backstage/plugin-permission-node@0.5.6-next.0 + - @backstage/backend-tasks@0.2.2-next.0 + - @backstage/plugin-azure-devops-backend@0.3.10-next.0 + - @backstage/plugin-graphql-backend@0.1.21-next.0 + - @backstage/plugin-proxy-backend@0.2.25-next.0 + - @backstage/plugin-rollbar-backend@0.1.28-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.3.6-next.0 + - @backstage/plugin-tech-insights-node@0.2.9-next.0 + +## 0.2.69 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-app-backend@0.3.30 + - @backstage/plugin-azure-devops-backend@0.3.9 + - @backstage/plugin-badges-backend@0.1.24 + - @backstage/plugin-catalog-backend@1.0.0 + - @backstage/plugin-jenkins-backend@0.1.19 + - @backstage/plugin-scaffolder-backend-module-rails@0.3.5 + - @backstage/plugin-tech-insights-backend@0.2.10 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.14 + - @backstage/plugin-todo-backend@0.1.27 + - @backstage/plugin-kubernetes-backend@0.4.13 + - @backstage/plugin-scaffolder-backend@1.0.0 + - @backstage/backend-common@0.13.1 + - @backstage/backend-tasks@0.2.1 + - @backstage/plugin-auth-backend@0.12.2 + - @backstage/plugin-code-coverage-backend@0.1.28 + - @backstage/catalog-model@1.0.0 + - @backstage/integration@1.0.0 + - @backstage/catalog-client@1.0.0 + - @backstage/config@1.0.0 + - @backstage/plugin-techdocs-backend@1.0.0 + - @backstage/plugin-permission-common@0.5.3 + - @backstage/plugin-search-backend-node@0.5.2 + - example-app@0.2.69 + - @backstage/plugin-auth-node@0.1.6 + - @backstage/plugin-graphql-backend@0.1.20 + - @backstage/plugin-kafka-backend@0.2.23 + - @backstage/plugin-permission-backend@0.5.5 + - @backstage/plugin-permission-node@0.5.5 + - @backstage/plugin-proxy-backend@0.2.24 + - @backstage/plugin-rollbar-backend@0.1.27 + - @backstage/plugin-search-backend@0.4.8 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.2 + - @backstage/plugin-tech-insights-node@0.2.8 + +## 0.2.68 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.0 + - @backstage/backend-tasks@0.2.0 + - @backstage/plugin-app-backend@0.3.29 + - @backstage/plugin-auth-backend@0.12.1 + - @backstage/plugin-catalog-backend@0.24.0 + - @backstage/plugin-scaffolder-backend@0.18.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.3.4 + - @backstage/plugin-kubernetes-backend@0.4.12 + - @backstage/plugin-rollbar-backend@0.1.26 + - @backstage/plugin-techdocs-backend@0.14.2 + - @backstage/catalog-model@0.13.0 + - @backstage/plugin-badges-backend@0.1.23 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.1 + - @backstage/plugin-search-backend-module-pg@0.3.1 + - @backstage/plugin-search-backend-node@0.5.1 + - @backstage/plugin-search-backend@0.4.7 + - @backstage/catalog-client@0.9.0 + - example-app@0.2.68 + - @backstage/plugin-auth-node@0.1.5 + - @backstage/plugin-azure-devops-backend@0.3.8 + - @backstage/plugin-code-coverage-backend@0.1.27 + - @backstage/plugin-graphql-backend@0.1.19 + - @backstage/plugin-jenkins-backend@0.1.18 + - @backstage/plugin-kafka-backend@0.2.22 + - @backstage/plugin-permission-backend@0.5.4 + - @backstage/plugin-permission-node@0.5.4 + - @backstage/plugin-proxy-backend@0.2.23 + - @backstage/plugin-tech-insights-backend@0.2.9 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.13 + - @backstage/plugin-tech-insights-node@0.2.7 + - @backstage/plugin-todo-backend@0.1.26 + +## 0.2.68-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.0-next.0 + - @backstage/backend-tasks@0.2.0-next.0 + - @backstage/plugin-app-backend@0.3.29-next.0 + - @backstage/plugin-auth-backend@0.12.1-next.0 + - @backstage/plugin-catalog-backend@0.24.0-next.0 + - @backstage/plugin-scaffolder-backend@0.18.0-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.3.4-next.0 + - @backstage/plugin-kubernetes-backend@0.4.12-next.0 + - @backstage/plugin-rollbar-backend@0.1.26-next.0 + - @backstage/plugin-techdocs-backend@0.14.2-next.0 + - @backstage/catalog-model@0.13.0-next.0 + - @backstage/plugin-badges-backend@0.1.23-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.1-next.0 + - @backstage/plugin-search-backend-module-pg@0.3.1-next.0 + - @backstage/plugin-search-backend-node@0.5.1-next.0 + - @backstage/plugin-search-backend@0.4.7-next.0 + - @backstage/catalog-client@0.9.0-next.0 + - @backstage/plugin-auth-node@0.1.5-next.0 + - @backstage/plugin-azure-devops-backend@0.3.8-next.0 + - @backstage/plugin-code-coverage-backend@0.1.27-next.0 + - @backstage/plugin-graphql-backend@0.1.19-next.0 + - @backstage/plugin-jenkins-backend@0.1.18-next.0 + - @backstage/plugin-kafka-backend@0.2.22-next.0 + - @backstage/plugin-permission-backend@0.5.4-next.0 + - @backstage/plugin-permission-node@0.5.4-next.0 + - @backstage/plugin-proxy-backend@0.2.23-next.0 + - @backstage/plugin-tech-insights-backend@0.2.9-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.13-next.0 + - @backstage/plugin-tech-insights-node@0.2.7-next.0 + - @backstage/plugin-todo-backend@0.1.26-next.0 + - example-app@0.2.68-next.0 + +## 0.2.67 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@0.12.0 + - @backstage/catalog-client@0.8.0 + - @backstage/plugin-catalog-backend@0.23.0 + - @backstage/backend-common@0.12.0 + - @backstage/plugin-scaffolder-backend@0.17.3 + - @backstage/plugin-techdocs-backend@0.14.1 + - @backstage/plugin-auth-backend@0.12.0 + - @backstage/plugin-badges-backend@0.1.22 + - @backstage/plugin-code-coverage-backend@0.1.26 + - @backstage/plugin-jenkins-backend@0.1.17 + - @backstage/plugin-todo-backend@0.1.25 + - @backstage/integration@0.8.0 + - @backstage/plugin-permission-common@0.5.2 + - @backstage/plugin-permission-node@0.5.3 + - @backstage/plugin-search-backend-node@0.5.0 + - @backstage/plugin-search-backend-module-pg@0.3.0 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.0 + - @backstage/plugin-tech-insights-backend@0.2.8 + - example-app@0.2.67 + - @backstage/plugin-auth-node@0.1.4 + - @backstage/plugin-kafka-backend@0.2.21 + - @backstage/plugin-kubernetes-backend@0.4.11 + - @backstage/backend-tasks@0.1.10 + - @backstage/plugin-app-backend@0.3.28 + - @backstage/plugin-azure-devops-backend@0.3.7 + - @backstage/plugin-graphql-backend@0.1.18 + - @backstage/plugin-permission-backend@0.5.3 + - @backstage/plugin-proxy-backend@0.2.22 + - @backstage/plugin-rollbar-backend@0.1.25 + - @backstage/plugin-scaffolder-backend-module-rails@0.3.3 + - @backstage/plugin-search-backend@0.4.6 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.12 + - @backstage/plugin-tech-insights-node@0.2.6 + +## 0.2.66 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.11.0 + - @backstage/plugin-catalog-backend@0.22.0 + - @backstage/plugin-scaffolder-backend@0.17.0 + - @backstage/plugin-graphql-backend@0.1.17 + - @backstage/plugin-auth-backend@0.11.0 + - @backstage/plugin-kubernetes-backend@0.4.10 + - @backstage/plugin-code-coverage-backend@0.1.25 + - @backstage/plugin-jenkins-backend@0.1.16 + - @backstage/plugin-tech-insights-backend@0.2.7 + - @backstage/plugin-todo-backend@0.1.24 + - @backstage/catalog-model@0.11.0 + - @backstage/catalog-client@0.7.2 + - @backstage/plugin-badges-backend@0.1.21 + - @backstage/backend-tasks@0.1.9 + - @backstage/plugin-scaffolder-backend-module-rails@0.3.2 + - @backstage/plugin-techdocs-backend@0.14.0 + - @backstage/plugin-permission-node@0.5.2 + - @backstage/integration@0.7.5 + - example-app@0.2.66 + - @backstage/plugin-app-backend@0.3.27 + - @backstage/plugin-auth-node@0.1.3 + - @backstage/plugin-azure-devops-backend@0.3.6 + - @backstage/plugin-kafka-backend@0.2.20 + - @backstage/plugin-permission-backend@0.5.2 + - @backstage/plugin-proxy-backend@0.2.21 + - @backstage/plugin-rollbar-backend@0.1.24 + - @backstage/plugin-search-backend@0.4.5 + - @backstage/plugin-search-backend-module-pg@0.2.9 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.11 + - @backstage/plugin-tech-insights-node@0.2.5 + +## 0.2.66 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.10.9 + - @backstage/backend-tasks@0.1.8 + - @backstage/catalog-client@0.7.1 + - @backstage/catalog-model@0.10.1 + - @backstage/config@0.1.15 + - @backstage/integration@0.7.4 + - @backstage/plugin-app-backend@0.3.26 + - @backstage/plugin-auth-backend@0.10.2 + - @backstage/plugin-auth-node@0.1.2 + - @backstage/plugin-azure-devops-backend@0.3.5 + - @backstage/plugin-badges-backend@0.1.20 + - @backstage/plugin-catalog-backend@0.21.5 + - @backstage/plugin-code-coverage-backend@0.1.24 + - @backstage/plugin-graphql-backend@0.1.16 + - @backstage/plugin-jenkins-backend@0.1.15 + - @backstage/plugin-kafka-backend@0.2.19 + - @backstage/plugin-kubernetes-backend@0.4.9 + - @backstage/plugin-permission-backend@0.5.1 + - @backstage/plugin-permission-common@0.5.1 + - @backstage/plugin-permission-node@0.5.1 + - @backstage/plugin-proxy-backend@0.2.20 + - @backstage/plugin-rollbar-backend@0.1.23 + - @backstage/plugin-scaffolder-backend@0.16.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.3.1 + - @backstage/plugin-search-backend@0.4.4 + - @backstage/plugin-search-backend-module-elasticsearch@0.0.10 + - @backstage/plugin-search-backend-module-pg@0.2.8 + - @backstage/plugin-search-backend-node@0.4.7 + - @backstage/plugin-tech-insights-backend@0.2.6 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.10 + - @backstage/plugin-tech-insights-node@0.2.4 + - @backstage/plugin-techdocs-backend@0.13.5 + - @backstage/plugin-todo-backend@0.1.23 + +## 0.2.65 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-backend@0.13.4 + - @backstage/plugin-catalog-backend@0.21.4 + - @backstage/backend-common@0.10.8 + - @backstage/catalog-client@0.7.0 + - @backstage/integration@0.7.3 + - @backstage/plugin-auth-backend@0.10.1 + - @backstage/plugin-auth-node@0.1.1 + - @backstage/plugin-permission-backend@0.5.0 + - @backstage/plugin-permission-common@0.5.0 + - @backstage/plugin-rollbar-backend@0.1.22 + - @backstage/plugin-scaffolder-backend@0.16.0 + - @backstage/backend-tasks@0.1.7 + - @backstage/catalog-model@0.10.0 + - @backstage/config@0.1.14 + - @backstage/plugin-app-backend@0.3.25 + - @backstage/plugin-azure-devops-backend@0.3.4 + - @backstage/plugin-badges-backend@0.1.19 + - @backstage/plugin-code-coverage-backend@0.1.23 + - @backstage/plugin-graphql-backend@0.1.15 + - @backstage/plugin-jenkins-backend@0.1.14 + - @backstage/plugin-kafka-backend@0.2.18 + - @backstage/plugin-kubernetes-backend@0.4.8 + - @backstage/plugin-permission-node@0.5.0 + - @backstage/plugin-proxy-backend@0.2.19 + - @backstage/plugin-scaffolder-backend-module-rails@0.3.0 + - @backstage/plugin-search-backend@0.4.3 + - @backstage/plugin-search-backend-module-elasticsearch@0.0.9 + - @backstage/plugin-search-backend-module-pg@0.2.7 + - @backstage/plugin-search-backend-node@0.4.6 + - @backstage/plugin-tech-insights-backend@0.2.5 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.9 + - @backstage/plugin-tech-insights-node@0.2.3 + - @backstage/plugin-todo-backend@0.1.22 + - example-app@0.2.65 + +## 0.2.64 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@0.6.0 + - @backstage/plugin-auth-backend@0.10.0 + - @backstage/backend-common@0.10.7 + - @backstage/backend-tasks@0.1.6 + - @backstage/plugin-app-backend@0.3.24 + - @backstage/plugin-catalog-backend@0.21.3 + - @backstage/plugin-code-coverage-backend@0.1.22 + - @backstage/plugin-scaffolder-backend@0.15.24 + - @backstage/plugin-search-backend-module-pg@0.2.6 + - @backstage/plugin-tech-insights-backend@0.2.4 + - @backstage/plugin-techdocs-backend@0.13.3 + - @backstage/plugin-auth-node@0.1.0 + - @backstage/plugin-permission-backend@0.4.3 + - @backstage/plugin-search-backend@0.4.2 + - @backstage/plugin-badges-backend@0.1.18 + - @backstage/plugin-jenkins-backend@0.1.13 + - @backstage/plugin-todo-backend@0.1.21 + - @backstage/plugin-permission-node@0.4.3 + - example-app@0.2.64 + - @backstage/plugin-azure-devops-backend@0.3.3 + - @backstage/plugin-graphql-backend@0.1.14 + - @backstage/plugin-kafka-backend@0.2.17 + - @backstage/plugin-kubernetes-backend@0.4.7 + - @backstage/plugin-proxy-backend@0.2.18 + - @backstage/plugin-rollbar-backend@0.1.21 + - @backstage/plugin-scaffolder-backend-module-rails@0.2.6 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.8 + - @backstage/plugin-tech-insights-node@0.2.2 + +## 0.2.64-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.10.0-next.0 + - @backstage/backend-common@0.10.7-next.0 + - @backstage/backend-tasks@0.1.6-next.0 + - @backstage/plugin-app-backend@0.3.24-next.0 + - @backstage/plugin-catalog-backend@0.21.3-next.0 + - @backstage/plugin-code-coverage-backend@0.1.22-next.0 + - @backstage/plugin-scaffolder-backend@0.15.24-next.0 + - @backstage/plugin-search-backend-module-pg@0.2.6-next.0 + - @backstage/plugin-tech-insights-backend@0.2.4-next.0 + - @backstage/plugin-techdocs-backend@0.13.3-next.0 + - example-app@0.2.64-next.0 + - @backstage/plugin-azure-devops-backend@0.3.3-next.0 + - @backstage/plugin-badges-backend@0.1.18-next.0 + - @backstage/plugin-graphql-backend@0.1.14-next.0 + - @backstage/plugin-jenkins-backend@0.1.13-next.0 + - @backstage/plugin-kafka-backend@0.2.17-next.0 + - @backstage/plugin-kubernetes-backend@0.4.7-next.0 + - @backstage/plugin-permission-backend@0.4.3-next.0 + - @backstage/plugin-permission-node@0.4.3-next.0 + - @backstage/plugin-proxy-backend@0.2.18-next.0 + - @backstage/plugin-rollbar-backend@0.1.21-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.2.6-next.0 + - @backstage/plugin-search-backend@0.4.2-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.8-next.0 + - @backstage/plugin-tech-insights-node@0.2.2-next.0 + - @backstage/plugin-todo-backend@0.1.21-next.0 + +## 0.2.63 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.9.0 + - @backstage/plugin-rollbar-backend@0.1.20 + - @backstage/plugin-catalog-backend@0.21.2 + - @backstage/plugin-scaffolder-backend@0.15.23 + - @backstage/plugin-proxy-backend@0.2.17 + - @backstage/backend-common@0.10.6 + - example-app@0.2.63 + - @backstage/backend-tasks@0.1.5 + - @backstage/plugin-app-backend@0.3.23 + - @backstage/plugin-azure-devops-backend@0.3.2 + - @backstage/plugin-badges-backend@0.1.17 + - @backstage/plugin-code-coverage-backend@0.1.21 + - @backstage/plugin-graphql-backend@0.1.13 + - @backstage/plugin-jenkins-backend@0.1.12 + - @backstage/plugin-kafka-backend@0.2.16 + - @backstage/plugin-kubernetes-backend@0.4.6 + - @backstage/plugin-permission-backend@0.4.2 + - @backstage/plugin-permission-node@0.4.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.2.5 + - @backstage/plugin-search-backend@0.4.1 + - @backstage/plugin-search-backend-module-pg@0.2.5 + - @backstage/plugin-tech-insights-backend@0.2.3 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.7 + - @backstage/plugin-tech-insights-node@0.2.1 + - @backstage/plugin-techdocs-backend@0.13.2 + - @backstage/plugin-todo-backend@0.1.20 + +## 0.2.63-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.9.0-next.1 + - @backstage/backend-common@0.10.6-next.0 + - example-app@0.2.63-next.1 + - @backstage/plugin-catalog-backend@0.21.2-next.1 + - @backstage/plugin-techdocs-backend@0.13.2-next.0 + - @backstage/backend-tasks@0.1.5-next.0 + - @backstage/plugin-app-backend@0.3.23-next.0 + - @backstage/plugin-azure-devops-backend@0.3.2-next.0 + - @backstage/plugin-badges-backend@0.1.17-next.0 + - @backstage/plugin-code-coverage-backend@0.1.21-next.0 + - @backstage/plugin-graphql-backend@0.1.13-next.0 + - @backstage/plugin-jenkins-backend@0.1.12-next.0 + - @backstage/plugin-kafka-backend@0.2.16-next.0 + - @backstage/plugin-kubernetes-backend@0.4.6-next.0 + - @backstage/plugin-permission-backend@0.4.2-next.1 + - @backstage/plugin-permission-node@0.4.2-next.1 + - @backstage/plugin-proxy-backend@0.2.17-next.1 + - @backstage/plugin-rollbar-backend@0.1.20-next.1 + - @backstage/plugin-scaffolder-backend@0.15.23-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.2.5-next.1 + - @backstage/plugin-search-backend@0.4.1-next.1 + - @backstage/plugin-search-backend-module-pg@0.2.5-next.0 + - @backstage/plugin-tech-insights-backend@0.2.3-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.7-next.0 + - @backstage/plugin-tech-insights-node@0.2.1-next.0 + - @backstage/plugin-todo-backend@0.1.20-next.0 + +## 0.2.63-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.9.0-next.0 + - @backstage/plugin-rollbar-backend@0.1.20-next.0 + - @backstage/plugin-catalog-backend@0.21.2-next.0 + - @backstage/plugin-scaffolder-backend@0.15.23-next.0 + - @backstage/plugin-proxy-backend@0.2.17-next.0 + - @backstage/plugin-permission-backend@0.4.2-next.0 + - @backstage/plugin-permission-node@0.4.2-next.0 + - @backstage/plugin-search-backend@0.4.1-next.0 + - example-app@0.2.63-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.2.5-next.0 + +## 0.2.62 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@0.4.5 + - @backstage/plugin-catalog-backend@0.21.1 + - @backstage/plugin-scaffolder-backend@0.15.22 + - @backstage/plugin-kubernetes-backend@0.4.5 + - @backstage/plugin-auth-backend@0.8.0 + - @backstage/plugin-search-backend@0.4.0 + - @backstage/plugin-tech-insights-backend@0.2.2 + - @backstage/plugin-techdocs-backend@0.13.1 + - @backstage/backend-common@0.10.5 + - example-app@0.2.62 + - @backstage/plugin-permission-backend@0.4.1 + - @backstage/plugin-permission-node@0.4.1 + +## 0.2.61 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.7.0 + - @backstage/plugin-permission-backend@0.4.0 + - @backstage/plugin-catalog-backend@0.21.0 + - @backstage/plugin-kubernetes-backend@0.4.4 + - @backstage/integration@0.7.2 + - @backstage/plugin-permission-common@0.4.0 + - @backstage/plugin-search-backend@0.3.1 + - @backstage/plugin-techdocs-backend@0.13.0 + - @backstage/backend-common@0.10.4 + - @backstage/config@0.1.13 + - @backstage/plugin-app-backend@0.3.22 + - @backstage/plugin-permission-node@0.4.0 + - @backstage/plugin-scaffolder-backend@0.15.21 + - @backstage/plugin-tech-insights-backend@0.2.0 + - @backstage/plugin-tech-insights-node@0.2.0 + - @backstage/catalog-model@0.9.10 + - example-app@0.2.61 + - @backstage/backend-tasks@0.1.4 + - @backstage/catalog-client@0.5.5 + - @backstage/plugin-azure-devops-backend@0.3.1 + - @backstage/plugin-badges-backend@0.1.16 + - @backstage/plugin-code-coverage-backend@0.1.20 + - @backstage/plugin-graphql-backend@0.1.12 + - @backstage/plugin-jenkins-backend@0.1.11 + - @backstage/plugin-kafka-backend@0.2.15 + - @backstage/plugin-proxy-backend@0.2.16 + - @backstage/plugin-rollbar-backend@0.1.19 + - @backstage/plugin-scaffolder-backend-module-rails@0.2.4 + - @backstage/plugin-search-backend-module-elasticsearch@0.0.8 + - @backstage/plugin-search-backend-module-pg@0.2.4 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.6 + - @backstage/plugin-todo-backend@0.1.19 + +## 0.2.61-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.7.0-next.0 + - @backstage/plugin-permission-backend@0.4.0-next.0 + - @backstage/plugin-catalog-backend@0.21.0-next.0 + - @backstage/plugin-permission-common@0.4.0-next.0 + - @backstage/backend-common@0.10.4-next.0 + - @backstage/config@0.1.13-next.0 + - @backstage/plugin-app-backend@0.3.22-next.0 + - @backstage/plugin-permission-node@0.4.0-next.0 + - @backstage/plugin-tech-insights-backend@0.2.0-next.0 + - @backstage/plugin-tech-insights-node@0.2.0-next.0 + - @backstage/catalog-model@0.9.10-next.0 + - example-app@0.2.61-next.0 + - @backstage/plugin-scaffolder-backend@0.15.21-next.0 + - @backstage/backend-tasks@0.1.4-next.0 + - @backstage/catalog-client@0.5.5-next.0 + - @backstage/integration@0.7.2-next.0 + - @backstage/plugin-azure-devops-backend@0.3.1-next.0 + - @backstage/plugin-badges-backend@0.1.16-next.0 + - @backstage/plugin-code-coverage-backend@0.1.20-next.0 + - @backstage/plugin-graphql-backend@0.1.12-next.0 + - @backstage/plugin-jenkins-backend@0.1.11-next.0 + - @backstage/plugin-kafka-backend@0.2.15-next.0 + - @backstage/plugin-kubernetes-backend@0.4.4-next.0 + - @backstage/plugin-proxy-backend@0.2.16-next.0 + - @backstage/plugin-rollbar-backend@0.1.19-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.2.4-next.0 + - @backstage/plugin-search-backend@0.3.1-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@0.0.8-next.0 + - @backstage/plugin-search-backend-module-pg@0.2.4-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.6-next.0 + - @backstage/plugin-techdocs-backend@0.12.4-next.0 + - @backstage/plugin-todo-backend@0.1.19-next.0 + +## 0.2.60 + +### Patch Changes + +- Updated dependencies + - @backstage/config@0.1.12 + - @backstage/plugin-scaffolder-backend@0.15.20 + - @backstage/integration@0.7.1 + - @backstage/backend-common@0.10.3 + - @backstage/plugin-todo-backend@0.1.18 + - @backstage/plugin-catalog-backend@0.20.0 + - @backstage/plugin-tech-insights-backend@0.1.5 + - @backstage/plugin-permission-node@0.3.0 + - @backstage/plugin-auth-backend@0.6.2 + - @backstage/plugin-code-coverage-backend@0.1.19 + - @backstage/plugin-search-backend-node@0.4.4 + - @backstage/plugin-techdocs-backend@0.12.3 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.5 + - @backstage/plugin-permission-backend@0.3.0 + - @backstage/plugin-graphql-backend@0.1.11 + - @backstage/plugin-kubernetes-backend@0.4.3 + - example-app@0.2.60 + - @backstage/backend-tasks@0.1.3 + - @backstage/catalog-client@0.5.4 + - @backstage/catalog-model@0.9.9 + - @backstage/plugin-badges-backend@0.1.15 + - @backstage/plugin-kafka-backend@0.2.14 + - @backstage/plugin-permission-common@0.3.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.2.3 + +## 0.2.59 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-rollbar-backend@0.1.18 + - @backstage/plugin-auth-backend@0.6.0 + - @backstage/backend-common@0.10.1 + - @backstage/plugin-app-backend@0.3.21 + - @backstage/plugin-catalog-backend@0.19.4 + - @backstage/plugin-scaffolder-backend@0.15.19 + - @backstage/integration@0.7.0 + - @backstage/plugin-techdocs-backend@0.12.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.4 + - @backstage/plugin-permission-backend@0.2.3 + - @backstage/plugin-permission-node@0.2.3 + - @backstage/plugin-code-coverage-backend@0.1.18 + - @backstage/plugin-scaffolder-backend-module-rails@0.2.2 + - @backstage/plugin-todo-backend@0.1.17 + +## 0.2.58 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.10.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.2.1 + - @backstage/catalog-client@0.5.3 + - @backstage/plugin-rollbar-backend@0.1.17 + - @backstage/plugin-auth-backend@0.5.2 + - @backstage/plugin-permission-common@0.3.0 + - @backstage/plugin-search-backend@0.3.0 + - @backstage/plugin-techdocs-backend@0.12.1 + - @backstage/plugin-jenkins-backend@0.1.10 + - @backstage/plugin-permission-node@0.2.2 + - example-app@0.2.58 + - @backstage/plugin-app-backend@0.3.20 + - @backstage/plugin-azure-devops-backend@0.2.6 + - @backstage/plugin-badges-backend@0.1.14 + - @backstage/plugin-catalog-backend@0.19.3 + - @backstage/plugin-code-coverage-backend@0.1.17 + - @backstage/plugin-graphql-backend@0.1.10 + - @backstage/plugin-kafka-backend@0.2.13 + - @backstage/plugin-kubernetes-backend@0.4.1 + - @backstage/plugin-permission-backend@0.2.2 + - @backstage/plugin-proxy-backend@0.2.15 + - @backstage/plugin-scaffolder-backend@0.15.18 + - @backstage/plugin-search-backend-module-pg@0.2.3 + - @backstage/plugin-tech-insights-backend@0.1.4 + - @backstage/plugin-tech-insights-node@0.1.2 + - @backstage/plugin-todo-backend@0.1.16 + +## 0.2.57 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-elasticsearch@0.0.7 + - @backstage/plugin-catalog-backend@0.19.2 + - @backstage/plugin-scaffolder-backend@0.15.17 + - @backstage/backend-common@0.9.14 + - @backstage/plugin-azure-devops-backend@0.2.5 + - @backstage/plugin-auth-backend@0.5.1 + - @backstage/catalog-model@0.9.8 + - example-app@0.2.57 + +## 0.2.56 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.5.0 + - @backstage/plugin-scaffolder-backend@0.15.16 + - @backstage/plugin-kubernetes-backend@0.4.0 + - @backstage/backend-common@0.9.13 + - @backstage/plugin-catalog-backend@0.19.1 + - @backstage/plugin-search-backend@0.2.8 + - @backstage/plugin-search-backend-module-elasticsearch@0.0.6 + - @backstage/plugin-search-backend-module-pg@0.2.2 + - @backstage/plugin-techdocs-backend@0.12.0 + - @backstage/plugin-todo-backend@0.1.15 + - @backstage/plugin-scaffolder-backend-module-rails@0.2.0 + - @backstage/plugin-azure-devops-backend@0.2.4 + - example-app@0.2.56 + +## 0.2.55 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@0.6.10 + - @backstage/plugin-scaffolder-backend@0.15.15 + - @backstage/plugin-auth-backend@0.4.10 + - @backstage/plugin-kubernetes-backend@0.3.20 + - @backstage/plugin-badges-backend@0.1.13 + - @backstage/plugin-catalog-backend@0.19.0 + - @backstage/plugin-code-coverage-backend@0.1.16 + - @backstage/plugin-jenkins-backend@0.1.9 + - @backstage/plugin-tech-insights-backend@0.1.3 + - @backstage/plugin-techdocs-backend@0.11.0 + - @backstage/plugin-todo-backend@0.1.14 + - @backstage/backend-common@0.9.12 + - @backstage/plugin-azure-devops-backend@0.2.3 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.2 + - @backstage/plugin-tech-insights-node@0.1.1 + - example-app@0.2.55 + +## 0.2.54 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.3.19 + - @backstage/plugin-tech-insights-backend@0.1.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.1 + - @backstage/plugin-auth-backend@0.4.9 + - @backstage/plugin-scaffolder-backend@0.15.14 + - @backstage/plugin-catalog-backend@0.18.0 + - @backstage/plugin-kafka-backend@0.2.12 + - @backstage/backend-common@0.9.11 + - @backstage/plugin-azure-devops-backend@0.2.2 + - @backstage/plugin-badges-backend@0.1.12 + - @backstage/plugin-code-coverage-backend@0.1.15 + - @backstage/plugin-jenkins-backend@0.1.8 + - @backstage/plugin-proxy-backend@0.2.14 + - @backstage/plugin-rollbar-backend@0.1.16 + - @backstage/plugin-search-backend@0.2.7 + - @backstage/plugin-techdocs-backend@0.10.9 + +## 0.2.52 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.9.9 + - @backstage/plugin-jenkins-backend@0.1.7 + - @backstage/plugin-search-backend-module-elasticsearch@0.0.5 + - @backstage/plugin-scaffolder-backend@0.15.12 + - @backstage/plugin-azure-devops-backend@0.2.0 + - @backstage/catalog-client@0.5.1 + - @backstage/plugin-auth-backend@0.4.7 + - @backstage/plugin-catalog-backend@0.17.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.1.7 + +## 0.2.50 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.4.4 + - @backstage/integration@0.6.8 + - @backstage/plugin-scaffolder-backend@0.15.8 + - @backstage/plugin-catalog-backend@0.17.0 + - @backstage/plugin-azure-devops-backend@0.1.2 + - @backstage/plugin-code-coverage-backend@0.1.13 + - @backstage/plugin-kubernetes-backend@0.3.17 + - example-app@0.2.50 + +## 0.2.49 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@0.16.0 + - @backstage/catalog-model@0.9.4 + - @backstage/plugin-proxy-backend@0.2.13 + - @backstage/plugin-auth-backend@0.4.3 + - @backstage/backend-common@0.9.6 + - @backstage/catalog-client@0.5.0 + - @backstage/integration@0.6.7 + - @backstage/plugin-scaffolder-backend@0.15.7 + - example-app@0.2.49 + - @backstage/plugin-badges-backend@0.1.11 + - @backstage/plugin-code-coverage-backend@0.1.12 + - @backstage/plugin-jenkins-backend@0.1.6 + - @backstage/plugin-techdocs-backend@0.10.4 + - @backstage/plugin-todo-backend@0.1.13 + +## 0.2.48 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.9.5 + - @backstage/plugin-catalog-backend@0.15.0 + - @backstage/plugin-azure-devops-backend@0.1.1 + - @backstage/integration@0.6.6 + - @backstage/plugin-auth-backend@0.4.2 + - example-app@0.2.48 + +## 0.2.47 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@0.14.0 + - @backstage/integration@0.6.5 + - @backstage/catalog-client@0.4.0 + - @backstage/catalog-model@0.9.3 + - @backstage/backend-common@0.9.4 + - @backstage/config@0.1.10 + - @backstage/plugin-kafka-backend@0.2.10 + - @backstage/plugin-kubernetes-backend@0.3.16 + - @backstage/plugin-rollbar-backend@0.1.15 + - @backstage/plugin-search-backend-module-pg@0.2.1 + - example-app@0.2.47 + - @backstage/plugin-auth-backend@0.4.1 + - @backstage/plugin-badges-backend@0.1.10 + - @backstage/plugin-code-coverage-backend@0.1.11 + - @backstage/plugin-jenkins-backend@0.1.5 + - @backstage/plugin-scaffolder-backend@0.15.6 + - @backstage/plugin-techdocs-backend@0.10.3 + - @backstage/plugin-todo-backend@0.1.12 + +## 0.2.46 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.4.0 + - @backstage/plugin-scaffolder-backend@0.15.5 + - @backstage/backend-common@0.9.3 + - @backstage/plugin-catalog-backend@0.13.8 + - @backstage/plugin-techdocs-backend@0.10.2 + - @backstage/integration@0.6.4 + - @backstage/plugin-search-backend-module-elasticsearch@0.0.4 + - example-app@0.2.46 + +## 0.2.44 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@0.13.6 + - @backstage/plugin-scaffolder-backend@0.15.3 + - @backstage/plugin-techdocs-backend@0.10.1 + - @backstage/plugin-auth-backend@0.3.24 + - @backstage/integration@0.6.3 + - @backstage/plugin-search-backend@0.2.6 + - @backstage/plugin-search-backend-module-elasticsearch@0.0.3 + - @backstage/plugin-search-backend-module-pg@0.2.0 + - @backstage/plugin-search-backend-node@0.4.2 + - @backstage/catalog-model@0.9.1 + - @backstage/backend-common@0.9.1 + - example-app@0.2.44 + +## 0.2.43 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.9.0 + - @backstage/plugin-catalog-backend@0.13.5 + - @backstage/plugin-search-backend-module-pg@0.1.3 + - @backstage/plugin-auth-backend@0.3.23 + - @backstage/plugin-scaffolder-backend@0.15.2 + - @backstage/integration@0.6.2 + - @backstage/config@0.1.8 + - @backstage/plugin-kubernetes-backend@0.3.15 + - @backstage/plugin-techdocs-backend@0.10.0 + - @backstage/plugin-jenkins-backend@0.1.4 + - @backstage/plugin-app-backend@0.3.16 + - @backstage/plugin-badges-backend@0.1.9 + - @backstage/plugin-code-coverage-backend@0.1.10 + - @backstage/plugin-graphql-backend@0.1.9 + - @backstage/plugin-kafka-backend@0.2.9 + - @backstage/plugin-proxy-backend@0.2.12 + - @backstage/plugin-rollbar-backend@0.1.14 + - @backstage/plugin-scaffolder-backend-module-rails@0.1.5 + - @backstage/plugin-search-backend@0.2.5 + - @backstage/plugin-todo-backend@0.1.11 + - example-app@0.2.43 + +## 0.2.41 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.3.20 + - @backstage/integration@0.6.0 + - @backstage/plugin-scaffolder-backend@0.15.0 + - @backstage/backend-common@0.8.9 + - @backstage/plugin-kubernetes-backend@0.3.14 + - @backstage/plugin-search-backend-module-elasticsearch@0.0.2 + - @backstage/plugin-search-backend-module-pg@0.1.1 + - @backstage/plugin-catalog-backend@0.13.2 + - @backstage/plugin-code-coverage-backend@0.1.9 + - @backstage/plugin-scaffolder-backend-module-rails@0.1.4 + - @backstage/plugin-techdocs-backend@0.9.2 + - @backstage/plugin-todo-backend@0.1.9 + - example-app@0.2.41 + +## 0.2.38 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.3.11 + - @backstage/catalog-client@0.3.17 + - @backstage/plugin-auth-backend@0.3.18 + - @backstage/plugin-jenkins-backend@0.1.2 + - @backstage/backend-common@0.8.7 + - @backstage/plugin-techdocs-backend@0.9.0 + - @backstage/plugin-scaffolder-backend@0.14.1 + +## 0.2.37 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.8.6 + - @backstage/plugin-scaffolder-backend@0.14.0 + - @backstage/plugin-catalog-backend@0.13.0 + - @backstage/plugin-auth-backend@0.3.17 + - @backstage/plugin-scaffolder-backend-module-rails@0.1.3 + - @backstage/plugin-search-backend-node@0.4.0 + - @backstage/plugin-techdocs-backend@0.8.7 + - @backstage/plugin-app-backend@0.3.15 + - @backstage/plugin-kubernetes-backend@0.3.10 + - @backstage/plugin-rollbar-backend@0.1.13 + - example-app@0.2.37 + - @backstage/plugin-search-backend@0.2.3 + +## 0.2.36 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@0.5.8 + - @backstage/plugin-scaffolder-backend@0.13.0 + - @backstage/catalog-model@0.9.0 + - @backstage/plugin-catalog-backend@0.12.0 + - @backstage/backend-common@0.8.5 + - @backstage/plugin-search-backend-node@0.3.0 + - example-app@0.2.36 + - @backstage/plugin-scaffolder-backend-module-rails@0.1.2 + - @backstage/catalog-client@0.3.16 + - @backstage/plugin-auth-backend@0.3.16 + - @backstage/plugin-badges-backend@0.1.8 + - @backstage/plugin-code-coverage-backend@0.1.8 + - @backstage/plugin-kafka-backend@0.2.8 + - @backstage/plugin-kubernetes-backend@0.3.9 + - @backstage/plugin-techdocs-backend@0.8.6 + - @backstage/plugin-todo-backend@0.1.8 + - @backstage/plugin-search-backend@0.2.2 + +## 0.2.35 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@0.12.4 + - @backstage/backend-common@0.8.4 + - @backstage/plugin-auth-backend@0.3.15 + - @backstage/plugin-catalog-backend@0.11.0 + - @backstage/plugin-techdocs-backend@0.8.5 + - @backstage/catalog-client@0.3.15 + - @backstage/plugin-kafka-backend@0.2.7 + +## 0.2.32 + +### Patch Changes + +- Updated dependencies [9c63be545] +- Updated dependencies [92963779b] +- Updated dependencies [27a9b503a] +- Updated dependencies [66c6bfebd] +- Updated dependencies [55a253de2] +- Updated dependencies [70bc30c5b] +- Updated dependencies [db1c8f93b] +- Updated dependencies [5aff84759] +- Updated dependencies [f26e6008f] +- Updated dependencies [eda9dbd5f] +- Updated dependencies [4f8cf50fe] +- Updated dependencies [875809a59] + - @backstage/plugin-catalog-backend@0.10.2 + - @backstage/backend-common@0.8.2 + - @backstage/catalog-model@0.8.2 + - @backstage/plugin-scaffolder-backend@0.12.0 + - @backstage/catalog-client@0.3.13 + - @backstage/plugin-search-backend-node@0.2.0 + - @backstage/plugin-search-backend@0.2.0 + - @backstage/plugin-proxy-backend@0.2.9 + - example-app@0.2.32 + +## 0.2.30 + +### Patch Changes + +- Updated dependencies [0fd4ea443] +- Updated dependencies [add62a455] +- Updated dependencies [260aaa684] +- Updated dependencies [704875e26] + - @backstage/plugin-catalog-backend@0.10.0 + - @backstage/catalog-client@0.3.12 + - @backstage/catalog-model@0.8.0 + - @backstage/plugin-scaffolder-backend@0.11.4 + - example-app@0.2.30 + - @backstage/plugin-auth-backend@0.3.12 + - @backstage/plugin-badges-backend@0.1.6 + - @backstage/plugin-code-coverage-backend@0.1.6 + - @backstage/plugin-kafka-backend@0.2.6 + - @backstage/plugin-kubernetes-backend@0.3.8 + - @backstage/plugin-techdocs-backend@0.8.2 + - @backstage/plugin-todo-backend@0.1.6 + +## 0.2.28 + +### Patch Changes + +- Updated dependencies [062bbf90f] +- Updated dependencies [22fd8ce2a] +- Updated dependencies [10c008a3a] +- Updated dependencies [82ca1ac22] +- Updated dependencies [f9fb4a205] +- Updated dependencies [9a207f052] +- Updated dependencies [16be1d093] +- Updated dependencies [fd39d4662] +- Updated dependencies [f9f9d633d] + - @backstage/plugin-scaffolder-backend@0.11.1 + - @backstage/backend-common@0.8.0 + - @backstage/catalog-model@0.7.9 + - @backstage/plugin-catalog-backend@0.9.0 + - @backstage/plugin-kubernetes-backend@0.3.7 + - example-app@0.2.28 + - @backstage/plugin-app-backend@0.3.13 + - @backstage/plugin-auth-backend@0.3.10 + - @backstage/plugin-badges-backend@0.1.4 + - @backstage/plugin-code-coverage-backend@0.1.5 + - @backstage/plugin-graphql-backend@0.1.8 + - @backstage/plugin-kafka-backend@0.2.5 + - @backstage/plugin-proxy-backend@0.2.8 + - @backstage/plugin-rollbar-backend@0.1.11 + - @backstage/plugin-search-backend@0.1.5 + - @backstage/plugin-techdocs-backend@0.8.1 + - @backstage/plugin-todo-backend@0.1.5 + +## 0.2.27 + +### Patch Changes + +- Updated dependencies [e0bfd3d44] +- Updated dependencies [e0bfd3d44] +- Updated dependencies [e0bfd3d44] +- Updated dependencies [38ca05168] +- Updated dependencies [b219821a0] +- Updated dependencies [69eefb5ae] +- Updated dependencies [f53fba29f] +- Updated dependencies [75c8cec39] +- Updated dependencies [227439a72] +- Updated dependencies [cdb3426e5] +- Updated dependencies [d8b81fd28] +- Updated dependencies [d1b1306d9] + - @backstage/plugin-scaffolder-backend@0.11.0 + - @backstage/backend-common@0.7.0 + - @backstage/plugin-techdocs-backend@0.8.0 + - @backstage/plugin-catalog-backend@0.8.2 + - @backstage/plugin-kubernetes-backend@0.3.6 + - @backstage/plugin-proxy-backend@0.2.7 + - @backstage/catalog-model@0.7.8 + - @backstage/config@0.1.5 + - @backstage/catalog-client@0.3.11 + - example-app@0.2.27 + - @backstage/plugin-app-backend@0.3.12 + - @backstage/plugin-auth-backend@0.3.9 + - @backstage/plugin-badges-backend@0.1.3 + - @backstage/plugin-code-coverage-backend@0.1.4 + - @backstage/plugin-graphql-backend@0.1.7 + - @backstage/plugin-kafka-backend@0.2.4 + - @backstage/plugin-rollbar-backend@0.1.10 + - @backstage/plugin-search-backend@0.1.4 + - @backstage/plugin-todo-backend@0.1.4 + +## 0.2.25 + +### Patch Changes + +- Updated dependencies [b9b2b4b76] +- Updated dependencies [84c54474d] +- Updated dependencies [49574a8a3] +- Updated dependencies [d367f63b5] +- Updated dependencies [5fe62f124] +- Updated dependencies [09b5fcf2e] +- Updated dependencies [55b2fc0c0] +- Updated dependencies [c42cd1daa] +- Updated dependencies [b42531cfe] +- Updated dependencies [c2306f898] + - @backstage/plugin-search-backend@0.1.3 + - @backstage/plugin-search-backend-node@0.1.3 + - @backstage/plugin-scaffolder-backend@0.10.0 + - @backstage/plugin-rollbar-backend@0.1.9 + - @backstage/backend-common@0.6.3 + - @backstage/plugin-catalog-backend@0.8.0 + - @backstage/plugin-code-coverage-backend@0.1.2 + - @backstage/plugin-kubernetes-backend@0.3.5 + - example-app@0.2.25 + +## 0.2.22 + +### Patch Changes + +- Updated dependencies [f03a52f5b] +- Updated dependencies [676ede643] +- Updated dependencies [1ac6a5233] +- Updated dependencies [2ab6f3ff0] +- Updated dependencies [0d55dcc74] +- Updated dependencies [29e1789e1] +- Updated dependencies [f1b2c1d2c] +- Updated dependencies [60e463c8d] +- Updated dependencies [676ede643] +- Updated dependencies [b196a4569] +- Updated dependencies [8488a1a96] +- Updated dependencies [37e3a69f5] +- Updated dependencies [6b2d54fd6] +- Updated dependencies [44590510d] +- Updated dependencies [164cc4c53] + - @backstage/plugin-kafka-backend@0.2.3 + - @backstage/plugin-catalog-backend@0.7.0 + - @backstage/plugin-kubernetes-backend@0.3.3 + - @backstage/plugin-scaffolder-backend@0.9.4 + - @backstage/plugin-auth-backend@0.3.7 + - @backstage/catalog-client@0.3.9 + - @backstage/plugin-todo-backend@0.1.3 + - @backstage/catalog-model@0.7.5 + - @backstage/backend-common@0.6.1 + +## 0.2.21 + +### Patch Changes + +- Updated dependencies [a2a3c7803] +- Updated dependencies [9f2e51e89] +- Updated dependencies [4d248725e] +- Updated dependencies [aaeb7ecf3] +- Updated dependencies [449776cd6] +- Updated dependencies [91e87c055] +- Updated dependencies [36d933ec5] +- Updated dependencies [113d3d59e] +- Updated dependencies [f47e11427] +- Updated dependencies [c862b3f36] + - @backstage/plugin-kubernetes-backend@0.3.2 + - @backstage/plugin-scaffolder-backend@0.9.3 + - @backstage/plugin-search-backend@0.1.2 + - @backstage/plugin-search-backend-node@0.1.2 + - @backstage/plugin-techdocs-backend@0.7.0 + - @backstage/plugin-auth-backend@0.3.6 + - @backstage/plugin-todo-backend@0.1.2 + - @backstage/plugin-catalog-backend@0.6.7 + - example-app@0.2.21 + +## 0.2.20 + +### Patch Changes + +- Updated dependencies [010aed784] +- Updated dependencies [8686eb38c] +- Updated dependencies [e7baa0d2e] +- Updated dependencies [8b4f7e42a] +- Updated dependencies [8686eb38c] +- Updated dependencies [0434853a5] +- Updated dependencies [4bc98a5b9] +- Updated dependencies [d2f4efc5d] +- Updated dependencies [8686eb38c] +- Updated dependencies [424742dc1] +- Updated dependencies [1f98a6ff8] +- Updated dependencies [8b5e59750] +- Updated dependencies [8686eb38c] + - @backstage/plugin-catalog-backend@0.6.6 + - @backstage/catalog-client@0.3.8 + - @backstage/plugin-techdocs-backend@0.6.5 + - @backstage/plugin-scaffolder-backend@0.9.2 + - @backstage/backend-common@0.6.0 + - @backstage/config@0.1.4 + - @backstage/plugin-auth-backend@0.3.5 + - @backstage/plugin-kubernetes-backend@0.3.1 + - example-app@0.2.20 + - @backstage/plugin-app-backend@0.3.10 + - @backstage/plugin-graphql-backend@0.1.6 + - @backstage/plugin-kafka-backend@0.2.2 + - @backstage/plugin-proxy-backend@0.2.6 + - @backstage/plugin-rollbar-backend@0.1.8 + - @backstage/plugin-todo-backend@0.1.1 + +## 0.2.19 + +### Patch Changes + +- Updated dependencies [5d7834baf] +- Updated dependencies [9ef5a126d] +- Updated dependencies [d7245b733] +- Updated dependencies [393b623ae] +- Updated dependencies [d7245b733] +- Updated dependencies [0b42fff22] +- Updated dependencies [0b42fff22] +- Updated dependencies [2ef5bc7ea] +- Updated dependencies [c532c1682] +- Updated dependencies [761698831] +- Updated dependencies [aa095e469] +- Updated dependencies [761698831] +- Updated dependencies [f98f212e4] +- Updated dependencies [9581ff0b4] +- Updated dependencies [93c62c755] +- Updated dependencies [02d78290a] +- Updated dependencies [a501128db] +- Updated dependencies [8de9963f0] +- Updated dependencies [5f1b7ea35] +- Updated dependencies [2e57922de] +- Updated dependencies [e2c1b3fb6] + - @backstage/plugin-kubernetes-backend@0.3.0 + - @backstage/plugin-catalog-backend@0.6.5 + - @backstage/backend-common@0.5.6 + - @backstage/plugin-app-backend@0.3.9 + - @backstage/plugin-scaffolder-backend@0.9.1 + - @backstage/catalog-model@0.7.4 + - @backstage/catalog-client@0.3.7 + - @backstage/plugin-techdocs-backend@0.6.4 + - @backstage/plugin-auth-backend@0.3.4 + - example-app@0.2.19 + +## 0.2.18 + +### Patch Changes + +- Updated dependencies [12d8f27a6] +- Updated dependencies [52b5bc3e2] +- Updated dependencies [ecdd407b1] +- Updated dependencies [4fbc9df79] +- Updated dependencies [12d8f27a6] +- Updated dependencies [497859088] +- Updated dependencies [1987c9341] +- Updated dependencies [f31b76b44] +- Updated dependencies [15eee03bc] +- Updated dependencies [f43192207] +- Updated dependencies [8adb48df4] +- Updated dependencies [e3adec2bd] +- Updated dependencies [9ce68b677] +- Updated dependencies [8106c9528] +- Updated dependencies [d0ed25196] +- Updated dependencies [96ccc8f69] +- Updated dependencies [3af994c81] + - @backstage/plugin-scaffolder-backend@0.9.0 + - @backstage/plugin-techdocs-backend@0.6.3 + - @backstage/plugin-catalog-backend@0.6.4 + - @backstage/plugin-kafka-backend@0.2.1 + - @backstage/catalog-model@0.7.3 + - @backstage/backend-common@0.5.5 + - @backstage/plugin-proxy-backend@0.2.5 + - @backstage/plugin-auth-backend@0.3.3 + - @backstage/plugin-kubernetes-backend@0.2.8 + - example-app@0.2.18 + +## 0.2.17 + +### Patch Changes + +- Updated dependencies [a70af22a2] +- Updated dependencies [ec504e7b4] +- Updated dependencies [a5f42cf66] +- Updated dependencies [f37992797] +- Updated dependencies [bad21a085] +- Updated dependencies [1c06cb312] +- Updated dependencies [2499f6cde] +- Updated dependencies [a1f5e6545] + - @backstage/plugin-kubernetes-backend@0.2.7 + - @backstage/plugin-auth-backend@0.3.2 + - @backstage/plugin-scaffolder-backend@0.8.0 + - @backstage/plugin-techdocs-backend@0.6.2 + - @backstage/catalog-model@0.7.2 + - @backstage/plugin-app-backend@0.3.8 + - @backstage/plugin-catalog-backend@0.6.3 + - @backstage/config@0.1.3 + - example-app@0.2.17 + +## 0.2.15 + +### Patch Changes + +- Updated dependencies [1deb31141] +- Updated dependencies [6ed2b47d6] +- Updated dependencies [77ad0003a] +- Updated dependencies [d2441aee3] +- Updated dependencies [727f0deec] +- Updated dependencies [fb53eb7cb] +- Updated dependencies [07bafa248] +- Updated dependencies [ffffea8e6] +- Updated dependencies [f3fbfb452] +- Updated dependencies [615103a63] +- Updated dependencies [84364b35c] +- Updated dependencies [82b2c11b6] +- Updated dependencies [965e200c6] +- Updated dependencies [5a5163519] +- Updated dependencies [82b2c11b6] +- Updated dependencies [08142b256] +- Updated dependencies [08142b256] + - @backstage/plugin-auth-backend@0.3.0 + - @backstage/plugin-scaffolder-backend@0.7.0 + - @backstage/plugin-catalog-backend@0.6.1 + - @backstage/plugin-app-backend@0.3.7 + - example-app@0.2.15 + - @backstage/backend-common@0.5.3 + - @backstage/plugin-techdocs-backend@0.6.0 + +## 0.2.14 + +### Patch Changes + +- Updated dependencies [c777df180] +- Updated dependencies [2430ee7c2] +- Updated dependencies [3149bfe63] +- Updated dependencies [6e612ce25] +- Updated dependencies [e44925723] +- Updated dependencies [9d6ef14bc] +- Updated dependencies [a26668913] +- Updated dependencies [025e122c3] +- Updated dependencies [e9aab60c7] +- Updated dependencies [24e47ef1e] +- Updated dependencies [7881f2117] +- Updated dependencies [529d16d27] +- Updated dependencies [cdea0baf1] +- Updated dependencies [11cb5ef94] + - @backstage/plugin-techdocs-backend@0.5.5 + - @backstage/backend-common@0.5.2 + - @backstage/plugin-catalog-backend@0.6.0 + - @backstage/catalog-model@0.7.1 + - example-app@0.2.14 + - @backstage/plugin-scaffolder-backend@0.6.0 + - @backstage/plugin-app-backend@0.3.6 + +## 0.2.13 + +### Patch Changes + +- Updated dependencies [26a3a6cf0] +- Updated dependencies [681111228] +- Updated dependencies [664dd08c9] +- Updated dependencies [9dd057662] +- Updated dependencies [234e7d985] +- Updated dependencies [d7b1d317f] +- Updated dependencies [a91aa6bf2] +- Updated dependencies [39b05b9ae] +- Updated dependencies [4eaa06057] + - @backstage/backend-common@0.5.1 + - @backstage/plugin-scaffolder-backend@0.5.2 + - @backstage/plugin-kubernetes-backend@0.2.6 + - @backstage/plugin-catalog-backend@0.5.5 + - @backstage/plugin-kafka-backend@0.2.0 + - @backstage/plugin-auth-backend@0.2.12 + - example-app@0.2.13 + - @backstage/plugin-app-backend@0.3.5 + +## 0.2.12 + +### Patch Changes + +- Updated dependencies [def2307f3] +- Updated dependencies [d54857099] +- Updated dependencies [0b135e7e0] +- Updated dependencies [318a6af9f] +- Updated dependencies [294a70cab] +- Updated dependencies [ac7be581a] +- Updated dependencies [0ea032763] +- Updated dependencies [5345a1f98] +- Updated dependencies [ed6baab66] +- Updated dependencies [ad838c02f] +- Updated dependencies [a5e27d5c1] +- Updated dependencies [0643a3336] +- Updated dependencies [a2291d7cc] +- Updated dependencies [f9ba00a1c] +- Updated dependencies [09a370426] +- Updated dependencies [a93f42213] + - @backstage/catalog-model@0.7.0 + - @backstage/plugin-catalog-backend@0.5.4 + - @backstage/plugin-kubernetes-backend@0.2.5 + - @backstage/backend-common@0.5.0 + - @backstage/plugin-scaffolder-backend@0.5.0 + - @backstage/plugin-techdocs-backend@0.5.4 + - @backstage/plugin-auth-backend@0.2.11 + - example-app@0.2.12 + - @backstage/plugin-kafka-backend@0.1.1 + - @backstage/plugin-app-backend@0.3.4 + - @backstage/plugin-graphql-backend@0.1.5 + - @backstage/plugin-proxy-backend@0.2.4 + - @backstage/plugin-rollbar-backend@0.1.7 + +## 0.2.11 + +### Patch Changes + +- cc068c0d6: Bump the gitbeaker dependencies to 28.x. + + To update your own installation, go through the `package.json` files of all of + your packages, and ensure that all dependencies on `@gitbeaker/node` or + `@gitbeaker/core` are at version `^28.0.2`. Then run `yarn install` at the root + of your repo. + +- Updated dependencies [68ad5af51] +- Updated dependencies [5a9a7e7c2] +- Updated dependencies [f3b064e1c] +- Updated dependencies [94fdf4955] +- Updated dependencies [cc068c0d6] +- Updated dependencies [ade6b3bdf] +- Updated dependencies [468579734] +- Updated dependencies [cb7af51e7] +- Updated dependencies [abbee6fff] +- Updated dependencies [147fadcb9] +- Updated dependencies [711ba55a2] + - @backstage/plugin-techdocs-backend@0.5.3 + - @backstage/plugin-kubernetes-backend@0.2.4 + - @backstage/catalog-model@0.6.1 + - @backstage/plugin-catalog-backend@0.5.3 + - @backstage/plugin-scaffolder-backend@0.4.1 + - @backstage/plugin-auth-backend@0.2.10 + - @backstage/backend-common@0.4.3 + +## 0.2.10 + +### Patch Changes + +- Updated dependencies [5eb8c9b9e] +- Updated dependencies [7e3451700] + - @backstage/plugin-scaffolder-backend@0.4.0 + +## 0.2.8 + +### Patch Changes + +- 7cfcd58ee: use node 14 for backend Dockerfile +- Updated dependencies [19554f6d6] +- Updated dependencies [33a82a713] +- Updated dependencies [5de26b9a6] +- Updated dependencies [30d6c78fb] +- Updated dependencies [5084e5039] +- Updated dependencies [a8573e53b] +- Updated dependencies [aed8f7f12] + - @backstage/plugin-scaffolder-backend@0.3.6 + - @backstage/plugin-catalog-backend@0.5.1 + - @backstage/plugin-techdocs-backend@0.5.0 + - example-app@0.2.8 + +## 0.2.7 + +### Patch Changes + +- Updated dependencies [c6eeefa35] +- Updated dependencies [fb386b760] +- Updated dependencies [c911061b7] +- Updated dependencies [7c3ffc0cd] +- Updated dependencies [dae4f3983] +- Updated dependencies [7b15cc271] +- Updated dependencies [e7496dc3e] +- Updated dependencies [1d1c2860f] +- Updated dependencies [0e6298f7e] +- Updated dependencies [8dd0a906d] +- Updated dependencies [4eafdec4a] +- Updated dependencies [6b37c95bf] +- Updated dependencies [8c31c681c] +- Updated dependencies [7b98e7fee] +- Updated dependencies [ac3560b42] +- Updated dependencies [94c65a9d4] +- Updated dependencies [0097057ed] + - @backstage/plugin-catalog-backend@0.5.0 + - @backstage/catalog-model@0.6.0 + - @backstage/plugin-techdocs-backend@0.4.0 + - @backstage/plugin-auth-backend@0.2.7 + - @backstage/backend-common@0.4.1 + - @backstage/plugin-scaffolder-backend@0.3.5 + - example-app@0.2.7 + - @backstage/plugin-kubernetes-backend@0.2.3 + +## 0.2.6 + +### Patch Changes + +- 1e22f8e0b: Unify `dockerode` library and type dependency versions +- Updated dependencies [6e8bb3ac0] +- Updated dependencies [e708679d7] +- Updated dependencies [047c018c9] +- Updated dependencies [38e24db00] +- Updated dependencies [e3bd9fc2f] +- Updated dependencies [12bbd748c] +- Updated dependencies [38d63fbe1] +- Updated dependencies [1e22f8e0b] +- Updated dependencies [83b6e0c1f] +- Updated dependencies [e3bd9fc2f] + - @backstage/plugin-catalog-backend@0.4.0 + - @backstage/backend-common@0.4.0 + - @backstage/config@0.1.2 + - @backstage/plugin-scaffolder-backend@0.3.4 + - @backstage/plugin-techdocs-backend@0.3.2 + - @backstage/catalog-model@0.5.0 + - example-app@0.2.6 + - @backstage/plugin-app-backend@0.3.3 + - @backstage/plugin-auth-backend@0.2.6 + - @backstage/plugin-graphql-backend@0.1.4 + - @backstage/plugin-kubernetes-backend@0.2.2 + - @backstage/plugin-proxy-backend@0.2.3 + - @backstage/plugin-rollbar-backend@0.1.5 + +## 0.2.5 + +### Patch Changes + +- Updated dependencies [ae95c7ff3] +- Updated dependencies [b4488ddb0] +- Updated dependencies [612368274] +- Updated dependencies [6a6c7c14e] +- Updated dependencies [08835a61d] +- Updated dependencies [a9fd599f7] +- Updated dependencies [e42402b47] +- Updated dependencies [bcc211a08] +- Updated dependencies [3619ea4c4] + - @backstage/plugin-techdocs-backend@0.3.1 + - @backstage/plugin-catalog-backend@0.3.0 + - @backstage/backend-common@0.3.3 + - @backstage/plugin-proxy-backend@0.2.2 + - @backstage/catalog-model@0.4.0 + - @backstage/plugin-kubernetes-backend@0.2.1 + - @backstage/plugin-app-backend@0.3.2 + - example-app@0.2.5 + - @backstage/plugin-auth-backend@0.2.5 + - @backstage/plugin-scaffolder-backend@0.3.3 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies [50eff1d00] +- Updated dependencies [ff1301d28] +- Updated dependencies [4b53294a6] +- Updated dependencies [3aa7efb3f] +- Updated dependencies [1ec19a3f4] +- Updated dependencies [ab94c9542] +- Updated dependencies [3a201c5d5] +- Updated dependencies [2daf18e80] +- Updated dependencies [069cda35f] +- Updated dependencies [b3d4e4e57] +- Updated dependencies [700a212b4] + - @backstage/plugin-auth-backend@0.2.4 + - @backstage/plugin-app-backend@0.3.1 + - @backstage/plugin-techdocs-backend@0.3.0 + - @backstage/backend-common@0.3.2 + - @backstage/plugin-catalog-backend@0.2.3 + - @backstage/catalog-model@0.3.1 + - @backstage/plugin-rollbar-backend@0.1.4 + - example-app@0.2.4 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies [1166fcc36] +- Updated dependencies [bff3305aa] +- Updated dependencies [0c2121240] +- Updated dependencies [ef2831dde] +- Updated dependencies [1185919f3] +- Updated dependencies [475fc0aaa] +- Updated dependencies [b47dce06f] +- Updated dependencies [5a1d8dca3] + - @backstage/catalog-model@0.3.0 + - @backstage/plugin-kubernetes-backend@0.2.0 + - @backstage/backend-common@0.3.1 + - @backstage/plugin-catalog-backend@0.2.2 + - @backstage/plugin-scaffolder-backend@0.3.2 + - example-app@0.2.3 + - @backstage/plugin-auth-backend@0.2.3 + - @backstage/plugin-techdocs-backend@0.2.2 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies [1722cb53c] +- Updated dependencies [1722cb53c] +- Updated dependencies [1722cb53c] +- Updated dependencies [f531d307c] +- Updated dependencies [3efd03c0e] +- Updated dependencies [7b37e6834] +- Updated dependencies [8e2effb53] +- Updated dependencies [d33f5157c] + - @backstage/backend-common@0.3.0 + - @backstage/plugin-app-backend@0.3.0 + - @backstage/plugin-catalog-backend@0.2.1 + - example-app@0.2.2 + - @backstage/plugin-scaffolder-backend@0.3.1 + - @backstage/plugin-auth-backend@0.2.2 + - @backstage/plugin-graphql-backend@0.1.3 + - @backstage/plugin-kubernetes-backend@0.1.3 + - @backstage/plugin-proxy-backend@0.2.1 + - @backstage/plugin-rollbar-backend@0.1.3 + - @backstage/plugin-sentry-backend@0.1.3 + - @backstage/plugin-techdocs-backend@0.2.1 + +## 0.2.1 + +### Patch Changes + +- Updated dependencies [752808090] +- Updated dependencies [462876399] +- Updated dependencies [59166e5ec] +- Updated dependencies [33b7300eb] + - @backstage/plugin-auth-backend@0.2.1 + - @backstage/plugin-scaffolder-backend@0.3.0 + - @backstage/backend-common@0.2.1 + - example-app@0.2.1 + +## 0.2.0 + +### Patch Changes + +- 440a17b39: Bump @backstage/catalog-backend and pass the now required UrlReader interface to the plugin +- 6840a68df: Pass GitHub token into Scaffolder GitHub Preparer +- 8c2b76e45: **BREAKING CHANGE** + + The existing loading of additional config files like `app-config.development.yaml` using APP_ENV or NODE_ENV has been removed. + Instead, the CLI and backend process now accept one or more `--config` flags to load config files. + + Without passing any flags, `app-config.yaml` and, if it exists, `app-config.local.yaml` will be loaded. + If passing any `--config ` flags, only those files will be loaded, **NOT** the default `app-config.yaml` one. + + The old behaviour of for example `APP_ENV=development` can be replicated using the following flags: + + ```bash + --config ../../app-config.yaml --config ../../app-config.development.yaml + ``` + +- 7bbeb049f: Change loadBackendConfig to return the config directly +- Updated dependencies [28edd7d29] +- Updated dependencies [819a70229] +- Updated dependencies [3a4236570] +- Updated dependencies [3e254503d] +- Updated dependencies [6d29605db] +- Updated dependencies [e0be86b6f] +- Updated dependencies [f70a52868] +- Updated dependencies [12b5fe940] +- Updated dependencies [5249594c5] +- Updated dependencies [56e4eb589] +- Updated dependencies [b4e5466e1] +- Updated dependencies [6f1768c0f] +- Updated dependencies [e37c0a005] +- Updated dependencies [3472c8be7] +- Updated dependencies [57d555eb2] +- Updated dependencies [61db1ddc6] +- Updated dependencies [81cb94379] +- Updated dependencies [1687b8fbb] +- Updated dependencies [a768a07fb] +- Updated dependencies [a768a07fb] +- Updated dependencies [f00ca3cb8] +- Updated dependencies [0c370c979] +- Updated dependencies [ce1f55398] +- Updated dependencies [e6b00e3af] +- Updated dependencies [9226c2aaa] +- Updated dependencies [6d97d2d6f] +- Updated dependencies [99710b102] +- Updated dependencies [6579769df] +- Updated dependencies [002860e7a] +- Updated dependencies [5adfc005e] +- Updated dependencies [33454c0f2] +- Updated dependencies [183e2a30d] +- Updated dependencies [948052cbb] +- Updated dependencies [65d722455] +- Updated dependencies [b652bf2cc] +- Updated dependencies [4036ff59d] +- Updated dependencies [991a950e0] +- Updated dependencies [512d70973] +- Updated dependencies [8c2b76e45] +- Updated dependencies [8bdf0bcf5] +- Updated dependencies [c926765a2] +- Updated dependencies [5a920c6e4] +- Updated dependencies [2f62e1804] +- Updated dependencies [440a17b39] +- Updated dependencies [fa56f4615] +- Updated dependencies [8afce088a] +- Updated dependencies [4c4eab81b] +- Updated dependencies [22ff8fba5] +- Updated dependencies [36a71d278] +- Updated dependencies [b3d57961c] +- Updated dependencies [6840a68df] +- Updated dependencies [a5cb46bac] +- Updated dependencies [49d70ccab] +- Updated dependencies [1c8c43756] +- Updated dependencies [26e69ab1a] +- Updated dependencies [5e4551e3a] +- Updated dependencies [e142a2767] +- Updated dependencies [e7f5471fd] +- Updated dependencies [e3d063ffa] +- Updated dependencies [440a17b39] +- Updated dependencies [7bbeb049f] + - @backstage/plugin-app-backend@0.2.0 + - @backstage/plugin-auth-backend@0.2.0 + - @backstage/catalog-model@0.2.0 + - @backstage/plugin-scaffolder-backend@0.2.0 + - @backstage/plugin-techdocs-backend@0.2.0 + - @backstage/plugin-catalog-backend@0.2.0 + - @backstage/plugin-proxy-backend@0.2.0 + - @backstage/backend-common@0.2.0 + - example-app@0.2.0 + - @backstage/plugin-graphql-backend@0.1.2 + - @backstage/plugin-kubernetes-backend@0.1.2 + - @backstage/plugin-rollbar-backend@0.1.2 + - @backstage/plugin-sentry-backend@0.1.2 diff --git a/packages/backend-legacy/README.md b/packages/backend-legacy/README.md new file mode 100644 index 0000000000..20e68dc746 --- /dev/null +++ b/packages/backend-legacy/README.md @@ -0,0 +1,61 @@ +# example-backend-legacy + +This package is an EXAMPLE of a Backstage backend using the old backend system. + +The main purpose of this package is to provide a test bed for Backstage plugins +that have a backend part. Feel free to experiment locally or within your fork +by adding dependencies and routes to this backend, to try things out. + +By running the `@backstage/create-app` script, you get your own separate Backstage backend. + +## Development + +To run the example backend, first go to the project root and run + +```bash +yarn install +``` + +You should only need to do this once. + +After that, go to the `packages/backend-legacy` directory and run + +```bash +yarn start +``` + +If you want to override any configuration locally, for example adding any secrets, +you can do so in `app-config.local.yaml`. + +The backend starts up on port 7007 per default. + +### Debugging + +The backend is a node process that can be inspected to allow breakpoints and live debugging. To enable this, pass the `--inspect` flag to [backend:dev](https://backstage.io/docs/local-dev/cli-build-system#backend-development). + +To debug the backend in [Visual Studio Code](https://code.visualstudio.com/): + +- Enable Auto Attach (⌘ + Shift + P > Toggle Auto Attach > Only With Flag) +- Open a VSCode terminal (Control + `) +- Run the backend from the VSCode terminal: `yarn start-backend:legacy --inspect` + +## Populating The Catalog + +If you want to use the catalog functionality, you need to add so called +locations to the backend. These are places where the backend can find some +entity descriptor data to consume and serve. For more information, see +[Software Catalog Overview - Adding Components to the Catalog](https://backstage.io/docs/features/software-catalog/#adding-components-to-the-catalog). + +For convenience we already include some statically configured example locations +in `app-config.yaml` under `catalog.locations`. For local development you can override these in your own `app-config.local.yaml`. + +## Authentication + +We chose [Passport](http://www.passportjs.org/) as authentication platform due to its comprehensive set of supported authentication [strategies](http://www.passportjs.org/packages/). + +Read more about the [auth-backend](https://github.com/backstage/backstage/blob/master/plugins/auth-backend/README.md) and [how to add a new provider](https://github.com/backstage/backstage/blob/master/docs/auth/add-auth-provider.md) + +## Documentation + +- [Backstage Readme](https://github.com/backstage/backstage/blob/master/README.md) +- [Backstage Documentation](https://backstage.io/docs) diff --git a/packages/backend-next/catalog-info.yaml b/packages/backend-legacy/catalog-info.yaml similarity index 68% rename from packages/backend-next/catalog-info.yaml rename to packages/backend-legacy/catalog-info.yaml index d297365e4b..a0acd6c653 100644 --- a/packages/backend-next/catalog-info.yaml +++ b/packages/backend-legacy/catalog-info.yaml @@ -1,8 +1,8 @@ apiVersion: backstage.io/v1alpha1 kind: Component metadata: - name: example-backend-next - title: example-backend-next + name: example-backend-legacy + title: example-backend-legacy spec: lifecycle: experimental type: backstage-backend diff --git a/packages/backend-legacy/knip-report.md b/packages/backend-legacy/knip-report.md new file mode 100644 index 0000000000..f57bda79b7 --- /dev/null +++ b/packages/backend-legacy/knip-report.md @@ -0,0 +1,27 @@ +# Knip report + +## Unused dependencies (13) + +| Name | Location | Severity | +| :------------------------------------------------- | :----------- | :------- | +| @backstage/plugin-scaffolder-backend-module-gitlab | package.json | error | +| @backstage/plugin-scaffolder-backend-module-rails | package.json | error | +| @backstage/plugin-azure-sites-common | package.json | error | +| @backstage/plugin-tech-insights-node | package.json | error | +| azure-devops-node-api | package.json | error | +| pg-connection-string | package.json | error | +| @gitbeaker/node | package.json | error | +| better-sqlite3 | package.json | error | +| @octokit/rest | package.json | error | +| example-app | package.json | error | +| mysql2 | package.json | error | +| luxon | package.json | error | +| pg | package.json | error | + +## Unused devDependencies (2) + +| Name | Location | Severity | +| :------------------------------- | :----------- | :------- | +| @types/express-serve-static-core | package.json | error | +| @types/luxon | package.json | error | + diff --git a/packages/backend-next/package.json b/packages/backend-legacy/package.json similarity index 52% rename from packages/backend-next/package.json rename to packages/backend-legacy/package.json index f5c61bd8ff..97178dcb2c 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-legacy/package.json @@ -1,21 +1,24 @@ { - "name": "example-backend-next", - "version": "0.0.26-next.1", - "main": "dist/index.cjs.js", - "types": "src/index.ts", - "license": "Apache-2.0", - "private": true, + "name": "example-backend-legacy", + "version": "0.2.98-next.1", "backstage": { "role": "backend" }, + "private": true, + "keywords": [ + "backstage" + ], "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", - "directory": "packages/backend-next" + "directory": "packages/backend-legacy" }, - "keywords": [ - "backstage" + "license": "Apache-2.0", + "main": "dist/index.cjs.js", + "types": "src/index.ts", + "files": [ + "dist" ], "scripts": { "build": "backstage-cli package build", @@ -25,42 +28,65 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-defaults": "workspace:^", - "@backstage/backend-plugin-api": "workspace:^", + "@backstage/backend-common": "workspace:^", "@backstage/backend-tasks": "workspace:^", + "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", + "@backstage/config": "workspace:^", + "@backstage/integration": "workspace:^", "@backstage/plugin-app-backend": "workspace:^", "@backstage/plugin-auth-backend": "workspace:^", - "@backstage/plugin-auth-backend-module-github-provider": "workspace:^", - "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", - "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^", - "@backstage/plugin-catalog-backend-module-openapi": "workspace:^", "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^", "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^", + "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-devtools-backend": "workspace:^", + "@backstage/plugin-events-backend": "workspace:^", + "@backstage/plugin-events-node": "workspace:^", "@backstage/plugin-kubernetes-backend": "workspace:^", - "@backstage/plugin-notifications-backend": "workspace:^", "@backstage/plugin-permission-backend": "workspace:^", - "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-permission-node": "workspace:^", "@backstage/plugin-proxy-backend": "workspace:^", "@backstage/plugin-scaffolder-backend": "workspace:^", - "@backstage/plugin-scaffolder-backend-module-github": "workspace:^", + "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "workspace:^", + "@backstage/plugin-scaffolder-backend-module-gitlab": "workspace:^", + "@backstage/plugin-scaffolder-backend-module-rails": "workspace:^", "@backstage/plugin-search-backend": "workspace:^", "@backstage/plugin-search-backend-module-catalog": "workspace:^", + "@backstage/plugin-search-backend-module-elasticsearch": "workspace:^", "@backstage/plugin-search-backend-module-explore": "workspace:^", + "@backstage/plugin-search-backend-module-pg": "workspace:^", "@backstage/plugin-search-backend-module-techdocs": "workspace:^", "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-signals-backend": "workspace:^", - "@backstage/plugin-techdocs-backend": "workspace:^" + "@backstage/plugin-signals-node": "workspace:^", + "@backstage/plugin-techdocs-backend": "workspace:^", + "@gitbeaker/node": "^35.1.0", + "@octokit/rest": "^19.0.3", + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/exporter-prometheus": "^0.50.0", + "@opentelemetry/sdk-metrics": "^1.13.0", + "azure-devops-node-api": "^12.0.0", + "better-sqlite3": "^9.0.0", + "dockerode": "^4.0.0", + "example-app": "link:../app", + "express": "^4.17.1", + "express-prom-bundle": "^7.0.0", + "express-promise-router": "^4.1.0", + "luxon": "^3.0.0", + "mysql2": "^3.0.0", + "pg": "^8.11.3", + "pg-connection-string": "^2.3.0", + "prom-client": "^15.0.0", + "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "workspace:^" - }, - "files": [ - "dist" - ] + "@backstage/cli": "workspace:^", + "@types/dockerode": "^3.3.0", + "@types/express": "^4.17.6", + "@types/express-serve-static-core": "^4.17.5", + "@types/luxon": "^3.0.0" + } } diff --git a/packages/backend/prometheus.yml b/packages/backend-legacy/prometheus.yml similarity index 100% rename from packages/backend/prometheus.yml rename to packages/backend-legacy/prometheus.yml diff --git a/packages/backend/src/index.test.ts b/packages/backend-legacy/src/index.test.ts similarity index 100% rename from packages/backend/src/index.test.ts rename to packages/backend-legacy/src/index.test.ts diff --git a/packages/backend-legacy/src/index.ts b/packages/backend-legacy/src/index.ts new file mode 100644 index 0000000000..34ea8b0f6c --- /dev/null +++ b/packages/backend-legacy/src/index.ts @@ -0,0 +1,184 @@ +/* + * 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. + */ + +/* + * Hi! + * + * Note that this is an EXAMPLE Backstage backend. Please check the README. + * + * Happy hacking! + */ + +import Router from 'express-promise-router'; +import { + CacheManager, + createServiceBuilder, + DatabaseManager, + getRootLogger, + HostDiscovery, + loadBackendConfig, + notFoundHandler, + ServerTokenManager, + UrlReaders, + useHotMemoize, +} from '@backstage/backend-common'; +import { TaskScheduler } from '@backstage/backend-tasks'; +import { Config } from '@backstage/config'; +import healthcheck from './plugins/healthcheck'; +import { metricsHandler, metricsInit } from './metrics'; +import auth from './plugins/auth'; +import catalog from './plugins/catalog'; +import events from './plugins/events'; +import kubernetes from './plugins/kubernetes'; +import scaffolder from './plugins/scaffolder'; +import proxy from './plugins/proxy'; +import search from './plugins/search'; +import techdocs from './plugins/techdocs'; +import app from './plugins/app'; +import permission from './plugins/permission'; +import signals from './plugins/signals'; +import devtools from './plugins/devtools'; +import { PluginEnvironment } from './types'; +import { ServerPermissionClient } from '@backstage/plugin-permission-node'; +import { DefaultIdentityClient } from '@backstage/plugin-auth-node'; +import { DefaultEventBroker } from '@backstage/plugin-events-backend'; +import { DefaultEventsService } from '@backstage/plugin-events-node'; +import { PrometheusExporter } from '@opentelemetry/exporter-prometheus'; +import { MeterProvider } from '@opentelemetry/sdk-metrics'; +import { metrics } from '@opentelemetry/api'; +import { DefaultSignalsService } from '@backstage/plugin-signals-node'; + +// Expose opentelemetry metrics using a Prometheus exporter on +// http://localhost:9464/metrics . See prometheus.yml in packages/backend for +// more information on how to scrape it. +const exporter = new PrometheusExporter(); +const meterProvider = new MeterProvider(); +metrics.setGlobalMeterProvider(meterProvider); +meterProvider.addMetricReader(exporter); + +function makeCreateEnv(config: Config) { + const root = getRootLogger(); + const reader = UrlReaders.default({ logger: root, config }); + const discovery = HostDiscovery.fromConfig(config); + const tokenManager = ServerTokenManager.fromConfig(config, { logger: root }); + const permissions = ServerPermissionClient.fromConfig(config, { + discovery, + tokenManager, + }); + const databaseManager = DatabaseManager.fromConfig(config, { logger: root }); + const cacheManager = CacheManager.fromConfig(config); + const taskScheduler = TaskScheduler.fromConfig(config, { databaseManager }); + const identity = DefaultIdentityClient.create({ + discovery, + }); + + const eventsService = DefaultEventsService.create({ logger: root }); + const eventBroker = new DefaultEventBroker( + root.child({ type: 'plugin' }), + eventsService, + ); + const signalsService = DefaultSignalsService.create({ + events: eventsService, + }); + + root.info(`Created UrlReader ${reader}`); + + return (plugin: string): PluginEnvironment => { + const logger = root.child({ type: 'plugin', plugin }); + const database = databaseManager.forPlugin(plugin); + const cache = cacheManager.forPlugin(plugin); + const scheduler = taskScheduler.forPlugin(plugin); + + return { + logger, + cache, + database, + config, + reader, + eventBroker, + events: eventsService, + discovery, + tokenManager, + permissions, + scheduler, + identity, + signals: signalsService, + }; + }; +} + +async function main() { + metricsInit(); + const logger = getRootLogger(); + + logger.info( + `You are running an example backend, which is supposed to be mainly used for contributing back to Backstage. ` + + `Do NOT deploy this to production. Read more here https://backstage.io/docs/getting-started/`, + ); + + const config = await loadBackendConfig({ + argv: process.argv, + logger, + }); + + const createEnv = makeCreateEnv(config); + + const healthcheckEnv = useHotMemoize(module, () => createEnv('healthcheck')); + const catalogEnv = useHotMemoize(module, () => createEnv('catalog')); + const scaffolderEnv = useHotMemoize(module, () => createEnv('scaffolder')); + const authEnv = useHotMemoize(module, () => createEnv('auth')); + const proxyEnv = useHotMemoize(module, () => createEnv('proxy')); + const searchEnv = useHotMemoize(module, () => createEnv('search')); + const techdocsEnv = useHotMemoize(module, () => createEnv('techdocs')); + const kubernetesEnv = useHotMemoize(module, () => createEnv('kubernetes')); + const appEnv = useHotMemoize(module, () => createEnv('app')); + const permissionEnv = useHotMemoize(module, () => createEnv('permission')); + const eventsEnv = useHotMemoize(module, () => createEnv('events')); + const devToolsEnv = useHotMemoize(module, () => createEnv('devtools')); + const signalsEnv = useHotMemoize(module, () => createEnv('signals')); + + const apiRouter = Router(); + apiRouter.use('/catalog', await catalog(catalogEnv)); + apiRouter.use('/events', await events(eventsEnv)); + apiRouter.use('/scaffolder', await scaffolder(scaffolderEnv)); + apiRouter.use('/auth', await auth(authEnv)); + apiRouter.use('/search', await search(searchEnv)); + apiRouter.use('/techdocs', await techdocs(techdocsEnv)); + apiRouter.use('/kubernetes', await kubernetes(kubernetesEnv)); + apiRouter.use('/proxy', await proxy(proxyEnv)); + apiRouter.use('/permission', await permission(permissionEnv)); + apiRouter.use('/devtools', await devtools(devToolsEnv)); + apiRouter.use('/signals', await signals(signalsEnv)); + apiRouter.use(notFoundHandler()); + + const service = createServiceBuilder(module) + .loadConfig(config) + .addRouter('', await healthcheck(healthcheckEnv)) + .addRouter('', metricsHandler()) + .addRouter('/api', apiRouter) + .addRouter('', await app(appEnv)); + + await service.start().catch(err => { + logger.error(err); + process.exit(1); + }); +} + +module.hot?.accept(); +main().catch(error => { + console.error('Backend failed to start up', error); + process.exit(1); +}); diff --git a/packages/backend/src/metrics.ts b/packages/backend-legacy/src/metrics.ts similarity index 100% rename from packages/backend/src/metrics.ts rename to packages/backend-legacy/src/metrics.ts diff --git a/packages/backend/src/plugins/DemoEventBasedEntityProvider.ts b/packages/backend-legacy/src/plugins/DemoEventBasedEntityProvider.ts similarity index 100% rename from packages/backend/src/plugins/DemoEventBasedEntityProvider.ts rename to packages/backend-legacy/src/plugins/DemoEventBasedEntityProvider.ts diff --git a/packages/backend/src/plugins/app.ts b/packages/backend-legacy/src/plugins/app.ts similarity index 100% rename from packages/backend/src/plugins/app.ts rename to packages/backend-legacy/src/plugins/app.ts diff --git a/packages/backend/src/plugins/auth.ts b/packages/backend-legacy/src/plugins/auth.ts similarity index 100% rename from packages/backend/src/plugins/auth.ts rename to packages/backend-legacy/src/plugins/auth.ts diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend-legacy/src/plugins/catalog.ts similarity index 100% rename from packages/backend/src/plugins/catalog.ts rename to packages/backend-legacy/src/plugins/catalog.ts diff --git a/packages/backend/src/plugins/devtools.ts b/packages/backend-legacy/src/plugins/devtools.ts similarity index 100% rename from packages/backend/src/plugins/devtools.ts rename to packages/backend-legacy/src/plugins/devtools.ts diff --git a/packages/backend/src/plugins/events.ts b/packages/backend-legacy/src/plugins/events.ts similarity index 100% rename from packages/backend/src/plugins/events.ts rename to packages/backend-legacy/src/plugins/events.ts diff --git a/packages/backend/src/plugins/healthcheck.ts b/packages/backend-legacy/src/plugins/healthcheck.ts similarity index 100% rename from packages/backend/src/plugins/healthcheck.ts rename to packages/backend-legacy/src/plugins/healthcheck.ts diff --git a/packages/backend/src/plugins/kubernetes.ts b/packages/backend-legacy/src/plugins/kubernetes.ts similarity index 100% rename from packages/backend/src/plugins/kubernetes.ts rename to packages/backend-legacy/src/plugins/kubernetes.ts diff --git a/packages/backend/src/plugins/permission.ts b/packages/backend-legacy/src/plugins/permission.ts similarity index 100% rename from packages/backend/src/plugins/permission.ts rename to packages/backend-legacy/src/plugins/permission.ts diff --git a/packages/backend/src/plugins/proxy.ts b/packages/backend-legacy/src/plugins/proxy.ts similarity index 100% rename from packages/backend/src/plugins/proxy.ts rename to packages/backend-legacy/src/plugins/proxy.ts diff --git a/packages/backend/src/plugins/scaffolder.ts b/packages/backend-legacy/src/plugins/scaffolder.ts similarity index 100% rename from packages/backend/src/plugins/scaffolder.ts rename to packages/backend-legacy/src/plugins/scaffolder.ts diff --git a/packages/backend/src/plugins/search.ts b/packages/backend-legacy/src/plugins/search.ts similarity index 100% rename from packages/backend/src/plugins/search.ts rename to packages/backend-legacy/src/plugins/search.ts diff --git a/packages/backend/src/plugins/signals.ts b/packages/backend-legacy/src/plugins/signals.ts similarity index 100% rename from packages/backend/src/plugins/signals.ts rename to packages/backend-legacy/src/plugins/signals.ts diff --git a/packages/backend/src/plugins/techdocs.ts b/packages/backend-legacy/src/plugins/techdocs.ts similarity index 100% rename from packages/backend/src/plugins/techdocs.ts rename to packages/backend-legacy/src/plugins/techdocs.ts diff --git a/packages/backend/src/types.ts b/packages/backend-legacy/src/types.ts similarity index 100% rename from packages/backend/src/types.ts rename to packages/backend-legacy/src/types.ts diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md deleted file mode 100644 index 5cc98ddb8a..0000000000 --- a/packages/backend-next/CHANGELOG.md +++ /dev/null @@ -1,2400 +0,0 @@ -# example-backend-next - -## 0.0.26-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.1 - - @backstage/plugin-notifications-backend@0.2.1-next.1 - - @backstage/plugin-catalog-backend@1.22.0-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.1 - - @backstage/plugin-scaffolder-backend@1.22.5-next.1 - - @backstage/plugin-search-backend@1.5.8-next.1 - - @backstage/backend-defaults@0.2.18-next.1 - - @backstage/plugin-app-backend@0.3.66-next.1 - - @backstage/plugin-kubernetes-backend@0.17.1-next.1 - - @backstage/backend-tasks@0.5.23-next.1 - - @backstage/plugin-auth-backend@0.22.5-next.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.4-next.1 - - @backstage/plugin-auth-node@0.4.13-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.36-next.1 - - @backstage/plugin-devtools-backend@0.3.4-next.1 - - @backstage/plugin-permission-backend@0.5.42-next.1 - - @backstage/plugin-permission-node@0.7.29-next.1 - - @backstage/plugin-proxy-backend@0.4.16-next.1 - - @backstage/plugin-scaffolder-backend-module-github@0.2.8-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.24-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.24-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.1 - - @backstage/plugin-search-backend-node@1.2.22-next.1 - - @backstage/plugin-signals-backend@0.1.4-next.1 - - @backstage/plugin-techdocs-backend@1.10.5-next.1 - - @backstage/plugin-auth-backend-module-github-provider@0.1.15-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.15-next.1 - - @backstage/backend-plugin-api@0.6.18-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.1-next.1 - -## 0.0.26-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend-module-github@0.2.8-next.0 - - @backstage/plugin-catalog-backend@1.22.0-next.0 - - @backstage/plugin-scaffolder-backend@1.22.5-next.0 - - @backstage/catalog-model@1.5.0-next.0 - - @backstage/plugin-search-backend-node@1.2.22-next.0 - - @backstage/plugin-search-backend@1.5.8-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.23-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.1-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.4-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.23-next.0 - - @backstage/plugin-auth-backend@0.22.5-next.0 - - @backstage/plugin-auth-node@0.4.13-next.0 - - @backstage/plugin-notifications-backend@0.2.1-next.0 - - @backstage/backend-plugin-api@0.6.18-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.36-next.0 - - @backstage/backend-defaults@0.2.18-next.0 - - @backstage/plugin-app-backend@0.3.66-next.0 - - @backstage/plugin-kubernetes-backend@0.17.1-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.0 - - @backstage/plugin-techdocs-backend@1.10.5-next.0 - - @backstage/backend-tasks@0.5.23-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.15-next.0 - - @backstage/plugin-devtools-backend@0.3.4-next.0 - - @backstage/plugin-permission-backend@0.5.42-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.15-next.0 - - @backstage/plugin-permission-common@0.7.13 - - @backstage/plugin-permission-node@0.7.29-next.0 - - @backstage/plugin-proxy-backend@0.4.16-next.0 - - @backstage/plugin-signals-backend@0.1.4-next.0 - -## 0.0.25 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-badges-backend@0.4.0 - - @backstage/plugin-kubernetes-backend@0.17.0 - - @backstage/plugin-azure-devops-backend@0.6.4 - - @backstage/plugin-techdocs-backend@1.10.4 - - @backstage/plugin-notifications-backend@0.2.0 - - @backstage/plugin-permission-node@0.7.28 - - @backstage/plugin-auth-backend@0.22.4 - - @backstage/plugin-catalog-backend@1.21.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.0 - - @backstage/backend-plugin-api@0.6.17 - - @backstage/plugin-search-backend@1.5.7 - - @backstage/plugin-todo-backend@0.3.16 - - @backstage/plugin-scaffolder-backend-module-github@0.2.7 - - @backstage/plugin-search-backend-module-techdocs@0.1.22 - - @backstage/plugin-search-backend-module-explore@0.1.21 - - @backstage/plugin-entity-feedback-backend@0.2.14 - - @backstage/plugin-search-backend-node@1.2.21 - - @backstage/plugin-lighthouse-backend@0.4.10 - - @backstage/plugin-permission-backend@0.5.41 - - @backstage/plugin-sonarqube-backend@0.2.19 - - @backstage/plugin-devtools-backend@0.3.3 - - @backstage/plugin-linguist-backend@0.5.15 - - @backstage/plugin-playlist-backend@0.3.21 - - @backstage/plugin-jenkins-backend@0.4.4 - - @backstage/backend-tasks@0.5.22 - - @backstage/plugin-nomad-backend@0.1.19 - - @backstage/plugin-adr-backend@0.4.14 - - @backstage/plugin-app-backend@0.3.65 - - @backstage/plugin-auth-node@0.4.12 - - @backstage/plugin-signals-backend@0.1.3 - - @backstage/plugin-proxy-backend@0.4.15 - - @backstage/plugin-scaffolder-backend@1.22.4 - - @backstage/backend-defaults@0.2.17 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.3 - - @backstage/plugin-catalog-backend-module-openapi@0.1.35 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4 - - @backstage/plugin-search-backend-module-catalog@0.1.22 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.14 - - @backstage/catalog-model@1.4.5 - - @backstage/plugin-auth-backend-module-github-provider@0.1.14 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15 - - @backstage/plugin-permission-common@0.7.13 - -## 0.0.25-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.17.0-next.1 - - @backstage/plugin-azure-devops-backend@0.6.4-next.1 - - @backstage/plugin-techdocs-backend@1.10.4-next.1 - - @backstage/plugin-auth-backend@0.22.4-next.1 - - @backstage/backend-plugin-api@0.6.17-next.1 - - @backstage/plugin-auth-node@0.4.12-next.1 - - @backstage/plugin-proxy-backend@0.4.15-next.1 - - @backstage/plugin-scaffolder-backend@1.22.4-next.1 - - @backstage/plugin-catalog-backend@1.21.1-next.1 - - @backstage/plugin-scaffolder-backend-module-github@0.2.7-next.1 - - @backstage/plugin-app-backend@0.3.65-next.1 - - @backstage/plugin-notifications-backend@0.2.0-next.1 - - @backstage/backend-defaults@0.2.17-next.1 - - @backstage/backend-tasks@0.5.22-next.1 - - @backstage/plugin-adr-backend@0.4.14-next.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.3-next.1 - - @backstage/plugin-badges-backend@0.3.14-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.35-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4-next.1 - - @backstage/plugin-devtools-backend@0.3.3-next.1 - - @backstage/plugin-entity-feedback-backend@0.2.14-next.1 - - @backstage/plugin-jenkins-backend@0.4.4-next.1 - - @backstage/plugin-lighthouse-backend@0.4.10-next.1 - - @backstage/plugin-linguist-backend@0.5.15-next.1 - - @backstage/plugin-nomad-backend@0.1.19-next.1 - - @backstage/plugin-permission-backend@0.5.41-next.1 - - @backstage/plugin-permission-node@0.7.28-next.1 - - @backstage/plugin-playlist-backend@0.3.21-next.1 - - @backstage/plugin-search-backend@1.5.7-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.22-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.21-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.22-next.1 - - @backstage/plugin-search-backend-node@1.2.21-next.1 - - @backstage/plugin-signals-backend@0.1.3-next.1 - - @backstage/plugin-sonarqube-backend@0.2.19-next.1 - - @backstage/plugin-todo-backend@0.3.16-next.1 - - @backstage/catalog-model@1.4.5 - - @backstage/plugin-auth-backend-module-github-provider@0.1.14-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.11-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.14-next.1 - - @backstage/plugin-permission-common@0.7.13 - -## 0.0.25-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-techdocs-backend@1.10.4-next.0 - - @backstage/plugin-catalog-backend@1.21.1-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.11-next.0 - - @backstage/plugin-kubernetes-backend@0.16.4-next.0 - - @backstage/plugin-signals-backend@0.1.3-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.22-next.0 - - @backstage/plugin-scaffolder-backend@1.22.4-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.35-next.0 - - @backstage/backend-defaults@0.2.17-next.0 - - @backstage/plugin-app-backend@0.3.65-next.0 - - @backstage/backend-plugin-api@0.6.17-next.0 - - @backstage/backend-tasks@0.5.22-next.0 - - @backstage/catalog-model@1.4.5 - - @backstage/plugin-adr-backend@0.4.14-next.0 - - @backstage/plugin-auth-backend@0.22.4-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.14-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.3-next.0 - - @backstage/plugin-auth-node@0.4.12-next.0 - - @backstage/plugin-azure-devops-backend@0.6.4-next.0 - - @backstage/plugin-badges-backend@0.3.14-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4-next.0 - - @backstage/plugin-devtools-backend@0.3.3-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.14-next.0 - - @backstage/plugin-jenkins-backend@0.4.4-next.0 - - @backstage/plugin-lighthouse-backend@0.4.10-next.0 - - @backstage/plugin-linguist-backend@0.5.15-next.0 - - @backstage/plugin-nomad-backend@0.1.19-next.0 - - @backstage/plugin-notifications-backend@0.1.3-next.0 - - @backstage/plugin-permission-backend@0.5.41-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.14-next.0 - - @backstage/plugin-permission-common@0.7.13 - - @backstage/plugin-permission-node@0.7.28-next.0 - - @backstage/plugin-playlist-backend@0.3.21-next.0 - - @backstage/plugin-proxy-backend@0.4.15-next.0 - - @backstage/plugin-scaffolder-backend-module-github@0.2.7-next.0 - - @backstage/plugin-search-backend@1.5.7-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.22-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.21-next.0 - - @backstage/plugin-search-backend-node@1.2.21-next.0 - - @backstage/plugin-sonarqube-backend@0.2.19-next.0 - - @backstage/plugin-todo-backend@0.3.16-next.0 - -## 0.0.24 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.21.0 - - @backstage/plugin-kubernetes-backend@0.16.3 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.3 - - @backstage/plugin-permission-backend@0.5.40 - - @backstage/plugin-proxy-backend@0.4.14 - - @backstage/plugin-scaffolder-backend@1.22.3 - - @backstage/plugin-jenkins-backend@0.4.3 - - @backstage/plugin-auth-backend@0.22.3 - - @backstage/plugin-auth-node@0.4.11 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.34 - - @backstage/plugin-azure-devops-backend@0.6.3 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.10 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.14 - - @backstage/plugin-lighthouse-backend@0.4.9 - - @backstage/plugin-linguist-backend@0.5.14 - - @backstage/plugin-search-backend-module-catalog@0.1.21 - - @backstage/plugin-search-backend-module-techdocs@0.1.21 - - @backstage/plugin-todo-backend@0.3.15 - - @backstage/backend-defaults@0.2.16 - - @backstage/plugin-app-backend@0.3.64 - - @backstage/plugin-adr-backend@0.4.13 - - @backstage/plugin-badges-backend@0.3.13 - - @backstage/plugin-entity-feedback-backend@0.2.13 - - @backstage/plugin-notifications-backend@0.1.2 - - @backstage/plugin-playlist-backend@0.3.20 - - @backstage/plugin-techdocs-backend@1.10.3 - - @backstage/plugin-auth-backend-module-github-provider@0.1.13 - - @backstage/backend-plugin-api@0.6.16 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.13 - - @backstage/plugin-permission-node@0.7.27 - - @backstage/plugin-signals-backend@0.1.2 - - @backstage/backend-tasks@0.5.21 - - @backstage/plugin-devtools-backend@0.3.2 - - @backstage/plugin-nomad-backend@0.1.18 - - @backstage/plugin-scaffolder-backend-module-github@0.2.6 - - @backstage/plugin-search-backend@1.5.6 - - @backstage/plugin-search-backend-module-explore@0.1.20 - - @backstage/plugin-search-backend-node@1.2.20 - - @backstage/plugin-sonarqube-backend@0.2.18 - - @backstage/catalog-model@1.4.5 - - @backstage/plugin-permission-common@0.7.13 - -## 0.0.23 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.20.0 - - @backstage/plugin-kubernetes-backend@0.16.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.2 - - @backstage/plugin-permission-backend@0.5.39 - - @backstage/plugin-catalog-backend-module-openapi@0.1.33 - - @backstage/plugin-auth-backend@0.22.2 - - @backstage/plugin-azure-devops-backend@0.6.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.9 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.13 - - @backstage/plugin-jenkins-backend@0.4.2 - - @backstage/plugin-lighthouse-backend@0.4.8 - - @backstage/plugin-linguist-backend@0.5.13 - - @backstage/plugin-scaffolder-backend@1.22.2 - - @backstage/plugin-search-backend-module-catalog@0.1.20 - - @backstage/plugin-search-backend-module-techdocs@0.1.20 - - @backstage/plugin-todo-backend@0.3.14 - - @backstage/backend-defaults@0.2.15 - - @backstage/plugin-app-backend@0.3.63 - - @backstage/plugin-adr-backend@0.4.12 - - @backstage/plugin-auth-node@0.4.10 - - @backstage/plugin-badges-backend@0.3.12 - - @backstage/plugin-entity-feedback-backend@0.2.12 - - @backstage/plugin-notifications-backend@0.1.1 - - @backstage/plugin-playlist-backend@0.3.19 - - @backstage/plugin-techdocs-backend@1.10.2 - - @backstage/backend-tasks@0.5.20 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.1 - - @backstage/plugin-devtools-backend@0.3.1 - - @backstage/plugin-nomad-backend@0.1.17 - - @backstage/plugin-permission-node@0.7.26 - - @backstage/plugin-proxy-backend@0.4.13 - - @backstage/plugin-scaffolder-backend-module-github@0.2.5 - - @backstage/plugin-search-backend@1.5.5 - - @backstage/plugin-search-backend-module-explore@0.1.19 - - @backstage/plugin-search-backend-node@1.2.19 - - @backstage/plugin-signals-backend@0.1.1 - - @backstage/plugin-sonarqube-backend@0.2.17 - - @backstage/backend-plugin-api@0.6.15 - - @backstage/catalog-model@1.4.5 - - @backstage/plugin-auth-backend-module-github-provider@0.1.12 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.12 - - @backstage/plugin-permission-common@0.7.13 - -## 0.0.22 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.19.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.1 - - @backstage/plugin-permission-backend@0.5.38 - - @backstage/plugin-catalog-backend-module-openapi@0.1.32 - - @backstage/plugin-auth-backend@0.22.1 - - @backstage/plugin-azure-devops-backend@0.6.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.8 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.12 - - @backstage/plugin-jenkins-backend@0.4.1 - - @backstage/plugin-kubernetes-backend@0.16.1 - - @backstage/plugin-lighthouse-backend@0.4.7 - - @backstage/plugin-linguist-backend@0.5.12 - - @backstage/plugin-scaffolder-backend@1.22.1 - - @backstage/plugin-search-backend-module-catalog@0.1.19 - - @backstage/plugin-search-backend-module-techdocs@0.1.19 - - @backstage/plugin-todo-backend@0.3.13 - - @backstage/plugin-auth-backend-module-github-provider@0.1.11 - - @backstage/plugin-techdocs-backend@1.10.1 - -## 0.0.21 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-notifications-backend@0.1.0 - - @backstage/plugin-scaffolder-backend@1.22.0 - - @backstage/plugin-linguist-backend@0.5.11 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.7 - - @backstage/plugin-catalog-backend-module-unprocessed@0.4.0 - - @backstage/plugin-catalog-backend@1.18.0 - - @backstage/plugin-devtools-backend@0.3.0 - - @backstage/plugin-jenkins-backend@0.4.0 - - @backstage/plugin-search-backend@1.5.4 - - @backstage/plugin-auth-node@0.4.9 - - @backstage/plugin-lighthouse-backend@0.4.6 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.0 - - @backstage/plugin-azure-devops-backend@0.6.0 - - @backstage/plugin-permission-backend@0.5.37 - - @backstage/plugin-signals-backend@0.1.0 - - @backstage/plugin-nomad-backend@0.1.16 - - @backstage/plugin-entity-feedback-backend@0.2.11 - - @backstage/plugin-playlist-backend@0.3.18 - - @backstage/backend-plugin-api@0.6.14 - - @backstage/plugin-auth-backend@0.22.0 - - @backstage/plugin-techdocs-backend@1.10.0 - - @backstage/plugin-scaffolder-backend-module-github@0.2.4 - - @backstage/plugin-permission-common@0.7.13 - - @backstage/plugin-search-backend-module-techdocs@0.1.18 - - @backstage/plugin-search-backend-module-catalog@0.1.18 - - @backstage/plugin-search-backend-module-explore@0.1.18 - - @backstage/backend-defaults@0.2.14 - - @backstage/plugin-kubernetes-backend@0.16.0 - - @backstage/plugin-adr-backend@0.4.11 - - @backstage/plugin-proxy-backend@0.4.12 - - @backstage/backend-tasks@0.5.19 - - @backstage/plugin-search-backend-node@1.2.18 - - @backstage/plugin-app-backend@0.3.62 - - @backstage/plugin-permission-node@0.7.25 - - @backstage/plugin-todo-backend@0.3.12 - - @backstage/plugin-badges-backend@0.3.11 - - @backstage/plugin-auth-backend-module-github-provider@0.1.11 - - @backstage/plugin-catalog-backend-module-openapi@0.1.31 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.11 - - @backstage/plugin-sonarqube-backend@0.2.16 - - @backstage/catalog-model@1.4.5 - -## 0.0.21-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.22.0-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.7-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.11-next.2 - - @backstage/plugin-catalog-backend@1.18.0-next.2 - - @backstage/plugin-devtools-backend@0.3.0-next.2 - - @backstage/plugin-jenkins-backend@0.4.0-next.2 - - @backstage/plugin-search-backend@1.5.4-next.2 - - @backstage/plugin-techdocs-backend@1.10.0-next.2 - - @backstage/plugin-notifications-backend@0.1.0-next.2 - - @backstage/plugin-linguist-backend@0.5.11-next.2 - - @backstage/plugin-kubernetes-backend@0.16.0-next.2 - - @backstage/plugin-todo-backend@0.3.12-next.2 - - @backstage/plugin-signals-backend@0.1.0-next.2 - - @backstage/plugin-scaffolder-backend-module-github@0.2.4-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.31-next.2 - - @backstage/plugin-adr-backend@0.4.11-next.2 - - @backstage/plugin-azure-devops-backend@0.6.0-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.18-next.2 - - @backstage/plugin-auth-backend@0.22.0-next.2 - - @backstage/backend-defaults@0.2.14-next.2 - - @backstage/plugin-app-backend@0.3.62-next.2 - - @backstage/plugin-auth-node@0.4.9-next.2 - - @backstage/plugin-badges-backend@0.3.11-next.2 - - @backstage/plugin-entity-feedback-backend@0.2.11-next.2 - - @backstage/plugin-lighthouse-backend@0.4.6-next.2 - - @backstage/plugin-playlist-backend@0.3.18-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.18-next.2 - - @backstage/backend-plugin-api@0.6.14-next.2 - - @backstage/backend-tasks@0.5.19-next.2 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.11-next.2 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.0-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11-next.2 - - @backstage/plugin-nomad-backend@0.1.16-next.2 - - @backstage/plugin-permission-backend@0.5.37-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.11-next.2 - - @backstage/plugin-permission-common@0.7.13-next.1 - - @backstage/plugin-permission-node@0.7.25-next.2 - - @backstage/plugin-proxy-backend@0.4.12-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.18-next.2 - - @backstage/plugin-search-backend-node@1.2.18-next.2 - - @backstage/plugin-sonarqube-backend@0.2.16-next.2 - -## 0.0.21-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-entity-feedback-backend@0.2.11-next.1 - - @backstage/plugin-notifications-backend@0.1.0-next.1 - - @backstage/plugin-scaffolder-backend@1.22.0-next.1 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.0-next.1 - - @backstage/plugin-scaffolder-backend-module-github@0.2.4-next.1 - - @backstage/plugin-app-backend@0.3.62-next.1 - - @backstage/plugin-signals-backend@0.1.0-next.1 - - @backstage/plugin-azure-devops-backend@0.6.0-next.1 - - @backstage/plugin-kubernetes-backend@0.16.0-next.1 - - @backstage/backend-plugin-api@0.6.14-next.1 - - @backstage/backend-tasks@0.5.19-next.1 - - @backstage/plugin-adr-backend@0.4.11-next.1 - - @backstage/plugin-auth-backend@0.22.0-next.1 - - @backstage/plugin-auth-node@0.4.9-next.1 - - @backstage/plugin-badges-backend@0.3.11-next.1 - - @backstage/plugin-catalog-backend@1.18.0-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.7-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.31-next.1 - - @backstage/plugin-devtools-backend@0.3.0-next.1 - - @backstage/plugin-jenkins-backend@0.4.0-next.1 - - @backstage/plugin-lighthouse-backend@0.4.6-next.1 - - @backstage/plugin-linguist-backend@0.5.11-next.1 - - @backstage/plugin-nomad-backend@0.1.16-next.1 - - @backstage/plugin-permission-backend@0.5.37-next.1 - - @backstage/plugin-permission-common@0.7.13-next.1 - - @backstage/plugin-permission-node@0.7.25-next.1 - - @backstage/plugin-playlist-backend@0.3.18-next.1 - - @backstage/plugin-proxy-backend@0.4.12-next.1 - - @backstage/plugin-search-backend@1.5.4-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.18-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.18-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.18-next.1 - - @backstage/plugin-search-backend-node@1.2.18-next.1 - - @backstage/plugin-sonarqube-backend@0.2.16-next.1 - - @backstage/plugin-techdocs-backend@1.9.7-next.1 - - @backstage/plugin-todo-backend@0.3.12-next.1 - - @backstage/backend-defaults@0.2.14-next.1 - - @backstage/catalog-model@1.4.5-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.11-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.11-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.11-next.1 - -## 0.0.21-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-linguist-backend@0.5.10-next.0 - - @backstage/plugin-auth-node@0.4.8-next.0 - - @backstage/plugin-lighthouse-backend@0.4.5-next.0 - - @backstage/plugin-auth-backend-module-guest-provider@0.1.0-next.0 - - @backstage/plugin-playlist-backend@0.3.17-next.0 - - @backstage/backend-plugin-api@0.6.13-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.10-next.0 - - @backstage/plugin-notifications-backend@0.1.0-next.0 - - @backstage/plugin-catalog-backend@1.18.0-next.0 - - @backstage/plugin-auth-backend@0.22.0-next.0 - - @backstage/plugin-jenkins-backend@0.4.0-next.0 - - @backstage/plugin-azure-devops-backend@0.6.0-next.0 - - @backstage/plugin-scaffolder-backend-module-github@0.2.3-next.0 - - @backstage/plugin-scaffolder-backend@1.22.0-next.0 - - @backstage/plugin-permission-common@0.7.13-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.17-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.17-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.17-next.0 - - @backstage/backend-defaults@0.2.13-next.0 - - @backstage/plugin-kubernetes-backend@0.16.0-next.0 - - @backstage/plugin-adr-backend@0.4.10-next.0 - - @backstage/plugin-proxy-backend@0.4.11-next.0 - - @backstage/backend-tasks@0.5.18-next.0 - - @backstage/plugin-search-backend-node@1.2.17-next.0 - - @backstage/plugin-signals-backend@0.0.4-next.0 - - @backstage/plugin-search-backend@1.5.3-next.0 - - @backstage/plugin-devtools-backend@0.3.0-next.0 - - @backstage/plugin-permission-node@0.7.24-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.6-next.0 - - @backstage/plugin-badges-backend@0.3.10-next.0 - - @backstage/plugin-permission-backend@0.5.36-next.0 - - @backstage/plugin-app-backend@0.3.61-next.0 - - @backstage/plugin-auth-backend-module-github-provider@0.1.10-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.30-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.10-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.10-next.0 - - @backstage/plugin-sonarqube-backend@0.2.15-next.0 - - @backstage/plugin-techdocs-backend@1.9.6-next.0 - - @backstage/plugin-nomad-backend@0.1.15-next.0 - - @backstage/plugin-todo-backend@0.3.11-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.10-next.0 - - @backstage/catalog-model@1.4.5-next.0 - -## 0.0.20 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7 - - @backstage/plugin-scaffolder-backend@1.21.0 - - @backstage/plugin-badges-backend@0.3.7 - - @backstage/plugin-azure-devops-backend@0.5.2 - - @backstage/plugin-auth-node@0.4.4 - - @backstage/plugin-entity-feedback-backend@0.2.7 - - @backstage/plugin-lighthouse-backend@0.4.2 - - @backstage/plugin-devtools-backend@0.2.7 - - @backstage/plugin-linguist-backend@0.5.7 - - @backstage/plugin-adr-backend@0.4.7 - - @backstage/plugin-kubernetes-backend@0.15.0 - - @backstage/plugin-signals-backend@0.0.1 - - @backstage/plugin-notifications-backend@0.0.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.27 - - @backstage/plugin-search-backend-module-techdocs@0.1.14 - - @backstage/plugin-search-backend-module-catalog@0.1.14 - - @backstage/plugin-search-backend-module-explore@0.1.14 - - @backstage/backend-plugin-api@0.6.10 - - @backstage/backend-defaults@0.2.10 - - @backstage/plugin-sonarqube-backend@0.2.12 - - @backstage/plugin-playlist-backend@0.3.14 - - @backstage/plugin-catalog-backend@1.17.0 - - @backstage/plugin-jenkins-backend@0.3.4 - - @backstage/backend-tasks@0.5.15 - - @backstage/plugin-nomad-backend@0.1.12 - - @backstage/plugin-app-backend@0.3.58 - - @backstage/plugin-search-backend@1.5.0 - - @backstage/plugin-todo-backend@0.3.8 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3 - - @backstage/plugin-techdocs-backend@1.9.3 - - @backstage/plugin-permission-backend@0.5.33 - - @backstage/plugin-permission-node@0.7.21 - - @backstage/plugin-proxy-backend@0.4.8 - - @backstage/plugin-search-backend-node@1.2.14 - - @backstage/plugin-permission-common@0.7.12 - -## 0.0.20-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-badges-backend@0.3.7-next.3 - - @backstage/plugin-kubernetes-backend@0.15.0-next.3 - - @backstage/backend-tasks@0.5.15-next.3 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.3 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.3 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.3 - - @backstage/plugin-notifications-backend@0.0.1-next.1 - - @backstage/plugin-signals-backend@0.0.1-next.3 - - @backstage/plugin-catalog-backend@1.17.0-next.3 - - @backstage/plugin-app-backend@0.3.58-next.3 - - @backstage/backend-defaults@0.2.10-next.3 - - @backstage/plugin-adr-backend@0.4.7-next.3 - - @backstage/plugin-auth-node@0.4.4-next.3 - - @backstage/plugin-azure-devops-backend@0.5.2-next.3 - - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.3 - - @backstage/plugin-devtools-backend@0.2.7-next.3 - - @backstage/plugin-entity-feedback-backend@0.2.7-next.3 - - @backstage/plugin-jenkins-backend@0.3.4-next.3 - - @backstage/plugin-lighthouse-backend@0.4.2-next.3 - - @backstage/plugin-linguist-backend@0.5.7-next.3 - - @backstage/plugin-nomad-backend@0.1.12-next.3 - - @backstage/plugin-permission-backend@0.5.33-next.3 - - @backstage/plugin-permission-node@0.7.21-next.3 - - @backstage/plugin-playlist-backend@0.3.14-next.3 - - @backstage/plugin-proxy-backend@0.4.8-next.3 - - @backstage/plugin-scaffolder-backend@1.21.0-next.3 - - @backstage/plugin-search-backend@1.5.0-next.3 - - @backstage/plugin-search-backend-module-catalog@0.1.14-next.3 - - @backstage/plugin-search-backend-module-explore@0.1.14-next.3 - - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.3 - - @backstage/plugin-search-backend-node@1.2.14-next.3 - - @backstage/plugin-sonarqube-backend@0.2.12-next.3 - - @backstage/plugin-techdocs-backend@1.9.3-next.3 - - @backstage/plugin-todo-backend@0.3.8-next.3 - - @backstage/backend-plugin-api@0.6.10-next.3 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.3 - - @backstage/plugin-permission-common@0.7.12 - -## 0.0.20-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.21.0-next.2 - - @backstage/plugin-signals-backend@0.0.1-next.2 - - @backstage/plugin-kubernetes-backend@0.15.0-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.14-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.14-next.2 - - @backstage/plugin-entity-feedback-backend@0.2.7-next.2 - - @backstage/plugin-azure-devops-backend@0.5.2-next.2 - - @backstage/backend-plugin-api@0.6.10-next.2 - - @backstage/plugin-lighthouse-backend@0.4.2-next.2 - - @backstage/backend-defaults@0.2.10-next.2 - - @backstage/plugin-sonarqube-backend@0.2.12-next.2 - - @backstage/plugin-devtools-backend@0.2.7-next.2 - - @backstage/plugin-linguist-backend@0.5.7-next.2 - - @backstage/plugin-playlist-backend@0.3.14-next.2 - - @backstage/plugin-catalog-backend@1.17.0-next.2 - - @backstage/plugin-jenkins-backend@0.3.4-next.2 - - @backstage/backend-tasks@0.5.15-next.2 - - @backstage/plugin-badges-backend@0.3.7-next.2 - - @backstage/plugin-nomad-backend@0.1.12-next.2 - - @backstage/plugin-adr-backend@0.4.7-next.2 - - @backstage/plugin-app-backend@0.3.58-next.2 - - @backstage/plugin-auth-node@0.4.4-next.2 - - @backstage/plugin-notifications-backend@0.0.1-next.0 - - @backstage/plugin-todo-backend@0.3.8-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.2 - - @backstage/plugin-permission-backend@0.5.33-next.2 - - @backstage/plugin-permission-node@0.7.21-next.2 - - @backstage/plugin-proxy-backend@0.4.8-next.2 - - @backstage/plugin-search-backend@1.5.0-next.2 - - @backstage/plugin-search-backend-node@1.2.14-next.2 - - @backstage/plugin-techdocs-backend@1.9.3-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.2 - - @backstage/plugin-permission-common@0.7.12 - -## 0.0.20-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.21.0-next.1 - - @backstage/plugin-azure-devops-backend@0.5.2-next.1 - - @backstage/plugin-catalog-backend@1.17.0-next.1 - - @backstage/backend-plugin-api@0.6.10-next.1 - - @backstage/backend-defaults@0.2.10-next.1 - - @backstage/backend-tasks@0.5.15-next.1 - - @backstage/plugin-adr-backend@0.4.7-next.1 - - @backstage/plugin-app-backend@0.3.58-next.1 - - @backstage/plugin-auth-node@0.4.4-next.1 - - @backstage/plugin-badges-backend@0.3.7-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.1 - - @backstage/plugin-devtools-backend@0.2.7-next.1 - - @backstage/plugin-entity-feedback-backend@0.2.7-next.1 - - @backstage/plugin-jenkins-backend@0.3.4-next.1 - - @backstage/plugin-kubernetes-backend@0.14.2-next.1 - - @backstage/plugin-lighthouse-backend@0.4.2-next.1 - - @backstage/plugin-linguist-backend@0.5.7-next.1 - - @backstage/plugin-nomad-backend@0.1.12-next.1 - - @backstage/plugin-permission-backend@0.5.33-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.1 - - @backstage/plugin-permission-common@0.7.12 - - @backstage/plugin-permission-node@0.7.21-next.1 - - @backstage/plugin-playlist-backend@0.3.14-next.1 - - @backstage/plugin-proxy-backend@0.4.8-next.1 - - @backstage/plugin-search-backend@1.5.0-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.14-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.14-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.1 - - @backstage/plugin-search-backend-node@1.2.14-next.1 - - @backstage/plugin-sonarqube-backend@0.2.12-next.1 - - @backstage/plugin-techdocs-backend@1.9.3-next.1 - - @backstage/plugin-todo-backend@0.3.8-next.1 - -## 0.0.20-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-azure-devops-backend@0.5.2-next.0 - - @backstage/plugin-kubernetes-backend@0.14.2-next.0 - - @backstage/plugin-catalog-backend@1.17.0-next.0 - - @backstage/plugin-search-backend@1.5.0-next.0 - - @backstage/plugin-todo-backend@0.3.8-next.0 - - @backstage/plugin-scaffolder-backend@1.21.0-next.0 - - @backstage/plugin-app-backend@0.3.58-next.0 - - @backstage/backend-defaults@0.2.10-next.0 - - @backstage/backend-tasks@0.5.15-next.0 - - @backstage/plugin-auth-node@0.4.4-next.0 - - @backstage/plugin-badges-backend@0.3.7-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.7-next.0 - - @backstage/plugin-linguist-backend@0.5.7-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.0 - - @backstage/plugin-permission-node@0.7.21-next.0 - - @backstage/plugin-playlist-backend@0.3.14-next.0 - - @backstage/plugin-proxy-backend@0.4.8-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.14-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.14-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.0 - - @backstage/plugin-sonarqube-backend@0.2.12-next.0 - - @backstage/plugin-techdocs-backend@1.9.3-next.0 - - @backstage/plugin-adr-backend@0.4.7-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.0 - - @backstage/plugin-devtools-backend@0.2.7-next.0 - - @backstage/plugin-jenkins-backend@0.3.4-next.0 - - @backstage/plugin-lighthouse-backend@0.4.2-next.0 - - @backstage/plugin-nomad-backend@0.1.12-next.0 - - @backstage/plugin-permission-backend@0.5.33-next.0 - - @backstage/plugin-search-backend-node@1.2.14-next.0 - - @backstage/backend-plugin-api@0.6.10-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.0 - - @backstage/plugin-permission-common@0.7.12 - -## 0.0.19 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-sonarqube-backend@0.2.11 - - @backstage/plugin-scaffolder-backend@1.20.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.26 - - @backstage/plugin-search-backend-module-techdocs@0.1.13 - - @backstage/plugin-search-backend-module-catalog@0.1.13 - - @backstage/plugin-search-backend-module-explore@0.1.13 - - @backstage/backend-plugin-api@0.6.9 - - @backstage/backend-defaults@0.2.9 - - @backstage/plugin-azure-devops-backend@0.5.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2 - - @backstage/plugin-entity-feedback-backend@0.2.6 - - @backstage/plugin-devtools-backend@0.2.6 - - @backstage/plugin-linguist-backend@0.5.6 - - @backstage/plugin-playlist-backend@0.3.13 - - @backstage/plugin-techdocs-backend@1.9.2 - - @backstage/plugin-jenkins-backend@0.3.3 - - @backstage/plugin-badges-backend@0.3.6 - - @backstage/plugin-search-backend@1.4.9 - - @backstage/plugin-nomad-backend@0.1.11 - - @backstage/plugin-todo-backend@0.3.7 - - @backstage/plugin-adr-backend@0.4.6 - - @backstage/plugin-app-backend@0.3.57 - - @backstage/plugin-permission-backend@0.5.32 - - @backstage/plugin-permission-common@0.7.12 - - @backstage/plugin-permission-node@0.7.20 - - @backstage/plugin-catalog-backend@1.16.1 - - @backstage/backend-tasks@0.5.14 - - @backstage/plugin-auth-node@0.4.3 - - @backstage/plugin-kubernetes-backend@0.14.1 - - @backstage/plugin-lighthouse-backend@0.4.1 - - @backstage/plugin-proxy-backend@0.4.7 - - @backstage/plugin-search-backend-node@1.2.13 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6 - -## 0.0.19-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-sonarqube-backend@0.2.11-next.2 - - @backstage/backend-plugin-api@0.6.9-next.2 - - @backstage/backend-defaults@0.2.9-next.2 - - @backstage/plugin-adr-backend@0.4.6-next.2 - - @backstage/plugin-app-backend@0.3.57-next.2 - - @backstage/plugin-auth-node@0.4.3-next.2 - - @backstage/plugin-azure-devops-backend@0.5.1-next.2 - - @backstage/plugin-badges-backend@0.3.6-next.2 - - @backstage/plugin-catalog-backend@1.16.1-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.2 - - @backstage/plugin-devtools-backend@0.2.6-next.2 - - @backstage/plugin-entity-feedback-backend@0.2.6-next.2 - - @backstage/plugin-jenkins-backend@0.3.3-next.2 - - @backstage/plugin-kubernetes-backend@0.14.1-next.2 - - @backstage/plugin-lighthouse-backend@0.4.1-next.2 - - @backstage/plugin-linguist-backend@0.5.6-next.2 - - @backstage/plugin-nomad-backend@0.1.11-next.2 - - @backstage/plugin-permission-backend@0.5.32-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.2 - - @backstage/plugin-permission-node@0.7.20-next.2 - - @backstage/plugin-playlist-backend@0.3.13-next.2 - - @backstage/plugin-proxy-backend@0.4.7-next.2 - - @backstage/plugin-scaffolder-backend@1.19.3-next.2 - - @backstage/plugin-search-backend@1.4.9-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.13-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.13-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.2 - - @backstage/plugin-search-backend-node@1.2.13-next.2 - - @backstage/plugin-techdocs-backend@1.9.2-next.2 - - @backstage/plugin-todo-backend@0.3.7-next.2 - - @backstage/backend-tasks@0.5.14-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.2 - -## 0.0.19-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-app-backend@0.3.57-next.1 - - @backstage/plugin-devtools-backend@0.2.6-next.1 - - @backstage/plugin-proxy-backend@0.4.7-next.1 - - @backstage/backend-defaults@0.2.9-next.1 - - @backstage/plugin-kubernetes-backend@0.14.1-next.1 - - @backstage/backend-tasks@0.5.14-next.1 - - @backstage/plugin-adr-backend@0.4.6-next.1 - - @backstage/plugin-auth-node@0.4.3-next.1 - - @backstage/plugin-azure-devops-backend@0.5.1-next.1 - - @backstage/plugin-badges-backend@0.3.6-next.1 - - @backstage/plugin-catalog-backend@1.16.1-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.1 - - @backstage/plugin-entity-feedback-backend@0.2.6-next.1 - - @backstage/plugin-jenkins-backend@0.3.3-next.1 - - @backstage/plugin-lighthouse-backend@0.4.1-next.1 - - @backstage/plugin-linguist-backend@0.5.6-next.1 - - @backstage/plugin-nomad-backend@0.1.11-next.1 - - @backstage/plugin-permission-backend@0.5.32-next.1 - - @backstage/plugin-permission-node@0.7.20-next.1 - - @backstage/plugin-playlist-backend@0.3.13-next.1 - - @backstage/plugin-scaffolder-backend@1.19.3-next.1 - - @backstage/plugin-search-backend@1.4.9-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.13-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.13-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.1 - - @backstage/plugin-search-backend-node@1.2.13-next.1 - - @backstage/plugin-sonarqube-backend@0.2.11-next.1 - - @backstage/plugin-techdocs-backend@1.9.2-next.1 - - @backstage/plugin-todo-backend@0.3.7-next.1 - - @backstage/backend-plugin-api@0.6.9-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.1 - - @backstage/plugin-permission-common@0.7.11 - -## 0.0.19-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.19.3-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.13-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.13-next.0 - - @backstage/plugin-azure-devops-backend@0.5.1-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.6-next.0 - - @backstage/plugin-devtools-backend@0.2.6-next.0 - - @backstage/plugin-linguist-backend@0.5.6-next.0 - - @backstage/plugin-playlist-backend@0.3.13-next.0 - - @backstage/plugin-techdocs-backend@1.9.2-next.0 - - @backstage/plugin-jenkins-backend@0.3.3-next.0 - - @backstage/plugin-badges-backend@0.3.6-next.0 - - @backstage/plugin-search-backend@1.4.9-next.0 - - @backstage/plugin-nomad-backend@0.1.11-next.0 - - @backstage/plugin-todo-backend@0.3.7-next.0 - - @backstage/plugin-adr-backend@0.4.6-next.0 - - @backstage/plugin-app-backend@0.3.57-next.0 - - @backstage/backend-defaults@0.2.9-next.0 - - @backstage/backend-plugin-api@0.6.9-next.0 - - @backstage/backend-tasks@0.5.14-next.0 - - @backstage/plugin-auth-node@0.4.3-next.0 - - @backstage/plugin-catalog-backend@1.16.1-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.0 - - @backstage/plugin-kubernetes-backend@0.14.1-next.0 - - @backstage/plugin-lighthouse-backend@0.4.1-next.0 - - @backstage/plugin-permission-backend@0.5.32-next.0 - - @backstage/plugin-permission-common@0.7.11 - - @backstage/plugin-permission-node@0.7.20-next.0 - - @backstage/plugin-proxy-backend@0.4.7-next.0 - - @backstage/plugin-search-backend-node@1.2.13-next.0 - - @backstage/plugin-sonarqube-backend@0.2.11-next.0 - -## 0.0.18 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1 - - @backstage/plugin-techdocs-backend@1.9.1 - - @backstage/plugin-catalog-backend@1.16.0 - - @backstage/plugin-azure-devops-backend@0.5.0 - - @backstage/plugin-scaffolder-backend@1.19.2 - - @backstage/backend-tasks@0.5.13 - - @backstage/plugin-lighthouse-backend@0.4.0 - - @backstage/plugin-kubernetes-backend@0.14.0 - - @backstage/plugin-auth-node@0.4.2 - - @backstage/plugin-permission-backend@0.5.31 - - @backstage/plugin-permission-common@0.7.11 - - @backstage/plugin-playlist-backend@0.3.12 - - @backstage/plugin-permission-node@0.7.19 - - @backstage/plugin-search-backend@1.4.8 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5 - - @backstage/plugin-search-backend-module-techdocs@0.1.12 - - @backstage/plugin-search-backend-module-catalog@0.1.12 - - @backstage/plugin-search-backend-module-explore@0.1.12 - - @backstage/backend-defaults@0.2.8 - - @backstage/plugin-adr-backend@0.4.5 - - @backstage/plugin-app-backend@0.3.56 - - @backstage/plugin-badges-backend@0.3.5 - - @backstage/plugin-catalog-backend-module-openapi@0.1.25 - - @backstage/plugin-devtools-backend@0.2.5 - - @backstage/plugin-entity-feedback-backend@0.2.5 - - @backstage/plugin-jenkins-backend@0.3.2 - - @backstage/plugin-linguist-backend@0.5.5 - - @backstage/plugin-nomad-backend@0.1.10 - - @backstage/plugin-proxy-backend@0.4.6 - - @backstage/plugin-search-backend-node@1.2.12 - - @backstage/plugin-sonarqube-backend@0.2.10 - - @backstage/plugin-todo-backend@0.3.6 - - @backstage/backend-plugin-api@0.6.8 - -## 0.0.18-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-azure-devops-backend@0.5.0-next.3 - - @backstage/plugin-scaffolder-backend@1.19.2-next.3 - - @backstage/backend-defaults@0.2.8-next.3 - - @backstage/backend-plugin-api@0.6.8-next.3 - - @backstage/backend-tasks@0.5.13-next.3 - - @backstage/plugin-adr-backend@0.4.5-next.3 - - @backstage/plugin-app-backend@0.3.56-next.3 - - @backstage/plugin-auth-node@0.4.2-next.3 - - @backstage/plugin-badges-backend@0.3.5-next.3 - - @backstage/plugin-catalog-backend@1.16.0-next.3 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.3 - - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.3 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.3 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.3 - - @backstage/plugin-devtools-backend@0.2.5-next.3 - - @backstage/plugin-entity-feedback-backend@0.2.5-next.3 - - @backstage/plugin-jenkins-backend@0.3.2-next.3 - - @backstage/plugin-kubernetes-backend@0.14.0-next.3 - - @backstage/plugin-lighthouse-backend@0.4.0-next.3 - - @backstage/plugin-linguist-backend@0.5.5-next.3 - - @backstage/plugin-nomad-backend@0.1.10-next.3 - - @backstage/plugin-permission-backend@0.5.31-next.3 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.3 - - @backstage/plugin-permission-common@0.7.10 - - @backstage/plugin-permission-node@0.7.19-next.3 - - @backstage/plugin-playlist-backend@0.3.12-next.3 - - @backstage/plugin-proxy-backend@0.4.6-next.3 - - @backstage/plugin-search-backend@1.4.8-next.3 - - @backstage/plugin-search-backend-module-catalog@0.1.12-next.3 - - @backstage/plugin-search-backend-module-explore@0.1.12-next.3 - - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.3 - - @backstage/plugin-search-backend-node@1.2.12-next.3 - - @backstage/plugin-sonarqube-backend@0.2.10-next.3 - - @backstage/plugin-techdocs-backend@1.9.1-next.3 - - @backstage/plugin-todo-backend@0.3.6-next.3 - -## 0.0.18-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.16.0-next.2 - - @backstage/plugin-lighthouse-backend@0.4.0-next.2 - - @backstage/plugin-auth-node@0.4.2-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.12-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.12-next.2 - - @backstage/backend-defaults@0.2.8-next.2 - - @backstage/backend-plugin-api@0.6.8-next.2 - - @backstage/backend-tasks@0.5.13-next.2 - - @backstage/plugin-adr-backend@0.4.5-next.2 - - @backstage/plugin-app-backend@0.3.56-next.2 - - @backstage/plugin-azure-devops-backend@0.5.0-next.2 - - @backstage/plugin-badges-backend@0.3.5-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.2 - - @backstage/plugin-devtools-backend@0.2.5-next.2 - - @backstage/plugin-entity-feedback-backend@0.2.5-next.2 - - @backstage/plugin-jenkins-backend@0.3.2-next.2 - - @backstage/plugin-kubernetes-backend@0.14.0-next.2 - - @backstage/plugin-linguist-backend@0.5.5-next.2 - - @backstage/plugin-nomad-backend@0.1.10-next.2 - - @backstage/plugin-permission-backend@0.5.31-next.2 - - @backstage/plugin-permission-common@0.7.10 - - @backstage/plugin-permission-node@0.7.19-next.2 - - @backstage/plugin-playlist-backend@0.3.12-next.2 - - @backstage/plugin-proxy-backend@0.4.6-next.2 - - @backstage/plugin-scaffolder-backend@1.19.2-next.2 - - @backstage/plugin-search-backend@1.4.8-next.2 - - @backstage/plugin-search-backend-node@1.2.12-next.2 - - @backstage/plugin-sonarqube-backend@0.2.10-next.2 - - @backstage/plugin-techdocs-backend@1.9.1-next.2 - - @backstage/plugin-todo-backend@0.3.6-next.2 - -## 0.0.18-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.1 - - @backstage/plugin-catalog-backend@1.15.1-next.1 - - @backstage/plugin-azure-devops-backend@0.5.0-next.1 - - @backstage/plugin-kubernetes-backend@0.14.0-next.1 - - @backstage/backend-defaults@0.2.8-next.1 - - @backstage/backend-plugin-api@0.6.8-next.1 - - @backstage/backend-tasks@0.5.13-next.1 - - @backstage/plugin-adr-backend@0.4.5-next.1 - - @backstage/plugin-app-backend@0.3.56-next.1 - - @backstage/plugin-auth-node@0.4.2-next.1 - - @backstage/plugin-badges-backend@0.3.5-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.1 - - @backstage/plugin-devtools-backend@0.2.5-next.1 - - @backstage/plugin-entity-feedback-backend@0.2.5-next.1 - - @backstage/plugin-jenkins-backend@0.3.2-next.1 - - @backstage/plugin-lighthouse-backend@0.3.5-next.1 - - @backstage/plugin-linguist-backend@0.5.5-next.1 - - @backstage/plugin-nomad-backend@0.1.10-next.1 - - @backstage/plugin-permission-backend@0.5.31-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.1 - - @backstage/plugin-permission-common@0.7.10 - - @backstage/plugin-permission-node@0.7.19-next.1 - - @backstage/plugin-playlist-backend@0.3.12-next.1 - - @backstage/plugin-proxy-backend@0.4.6-next.1 - - @backstage/plugin-scaffolder-backend@1.19.2-next.1 - - @backstage/plugin-search-backend@1.4.8-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.12-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.12-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.1 - - @backstage/plugin-search-backend-node@1.2.12-next.1 - - @backstage/plugin-sonarqube-backend@0.2.10-next.1 - - @backstage/plugin-techdocs-backend@1.9.1-next.1 - - @backstage/plugin-todo-backend@0.3.6-next.1 - -## 0.0.18-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-tasks@0.5.13-next.0 - - @backstage/plugin-scaffolder-backend@1.19.2-next.0 - - @backstage/plugin-kubernetes-backend@0.14.0-next.0 - - @backstage/backend-defaults@0.2.8-next.0 - - @backstage/plugin-adr-backend@0.4.5-next.0 - - @backstage/plugin-app-backend@0.3.56-next.0 - - @backstage/plugin-auth-node@0.4.2-next.0 - - @backstage/plugin-azure-devops-backend@0.4.5-next.0 - - @backstage/plugin-badges-backend@0.3.5-next.0 - - @backstage/plugin-catalog-backend@1.15.1-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.0 - - @backstage/plugin-devtools-backend@0.2.5-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.5-next.0 - - @backstage/plugin-jenkins-backend@0.3.2-next.0 - - @backstage/plugin-lighthouse-backend@0.3.5-next.0 - - @backstage/plugin-linguist-backend@0.5.5-next.0 - - @backstage/plugin-nomad-backend@0.1.10-next.0 - - @backstage/plugin-permission-backend@0.5.31-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.0 - - @backstage/plugin-permission-node@0.7.19-next.0 - - @backstage/plugin-playlist-backend@0.3.12-next.0 - - @backstage/plugin-proxy-backend@0.4.6-next.0 - - @backstage/plugin-search-backend@1.4.8-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.12-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.12-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.0 - - @backstage/plugin-search-backend-node@1.2.12-next.0 - - @backstage/plugin-sonarqube-backend@0.2.10-next.0 - - @backstage/plugin-techdocs-backend@1.9.1-next.0 - - @backstage/plugin-todo-backend@0.3.6-next.0 - - @backstage/backend-plugin-api@0.6.8-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.0 - - @backstage/plugin-permission-common@0.7.10 - -## 0.0.17 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.15.0 - - @backstage/plugin-kubernetes-backend@0.13.1 - - @backstage/plugin-search-backend-node@1.2.11 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0 - - @backstage/plugin-techdocs-backend@1.9.0 - - @backstage/plugin-scaffolder-backend@1.19.0 - - @backstage/plugin-search-backend@1.4.7 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4 - - @backstage/plugin-entity-feedback-backend@0.2.4 - - @backstage/backend-plugin-api@0.6.7 - - @backstage/plugin-linguist-backend@0.5.4 - - @backstage/plugin-playlist-backend@0.3.11 - - @backstage/backend-tasks@0.5.12 - - @backstage/plugin-badges-backend@0.3.4 - - @backstage/plugin-app-backend@0.3.55 - - @backstage/plugin-search-backend-module-techdocs@0.1.11 - - @backstage/plugin-permission-common@0.7.10 - - @backstage/plugin-jenkins-backend@0.3.1 - - @backstage/plugin-adr-backend@0.4.4 - - @backstage/plugin-proxy-backend@0.4.5 - - @backstage/plugin-catalog-backend-module-openapi@0.1.24 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4 - - @backstage/plugin-lighthouse-backend@0.3.4 - - @backstage/plugin-search-backend-module-catalog@0.1.11 - - @backstage/plugin-todo-backend@0.3.5 - - @backstage/plugin-devtools-backend@0.2.4 - - @backstage/backend-defaults@0.2.7 - - @backstage/plugin-auth-node@0.4.1 - - @backstage/plugin-azure-devops-backend@0.4.4 - - @backstage/plugin-nomad-backend@0.1.9 - - @backstage/plugin-permission-backend@0.5.30 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4 - - @backstage/plugin-permission-node@0.7.18 - - @backstage/plugin-search-backend-module-explore@0.1.11 - - @backstage/plugin-sonarqube-backend@0.2.9 - -## 0.0.17-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.13.1-next.2 - - @backstage/plugin-scaffolder-backend@1.19.0-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.2 - - @backstage/plugin-entity-feedback-backend@0.2.4-next.2 - - @backstage/backend-plugin-api@0.6.7-next.2 - - @backstage/plugin-linguist-backend@0.5.4-next.2 - - @backstage/plugin-playlist-backend@0.3.11-next.2 - - @backstage/plugin-techdocs-backend@1.9.0-next.2 - - @backstage/plugin-catalog-backend@1.15.0-next.2 - - @backstage/backend-tasks@0.5.12-next.2 - - @backstage/plugin-badges-backend@0.3.4-next.2 - - @backstage/plugin-app-backend@0.3.55-next.2 - - @backstage/backend-defaults@0.2.7-next.2 - - @backstage/plugin-adr-backend@0.4.4-next.2 - - @backstage/plugin-auth-node@0.4.1-next.2 - - @backstage/plugin-azure-devops-backend@0.4.4-next.2 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.2 - - @backstage/plugin-devtools-backend@0.2.4-next.2 - - @backstage/plugin-jenkins-backend@0.3.1-next.2 - - @backstage/plugin-lighthouse-backend@0.3.4-next.2 - - @backstage/plugin-nomad-backend@0.1.9-next.2 - - @backstage/plugin-permission-backend@0.5.30-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4-next.2 - - @backstage/plugin-permission-node@0.7.18-next.2 - - @backstage/plugin-proxy-backend@0.4.5-next.2 - - @backstage/plugin-search-backend@1.4.7-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.11-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.11-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.2 - - @backstage/plugin-search-backend-node@1.2.11-next.2 - - @backstage/plugin-sonarqube-backend@0.2.9-next.2 - - @backstage/plugin-todo-backend@0.3.5-next.2 - - @backstage/plugin-catalog-backend-module-openapi@0.1.24-next.2 - -## 0.0.17-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.15.0-next.1 - - @backstage/plugin-techdocs-backend@1.9.0-next.1 - - @backstage/plugin-scaffolder-backend@1.19.0-next.1 - - @backstage/plugin-catalog-backend-module-openapi@0.1.24-next.1 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.1 - - @backstage/plugin-jenkins-backend@0.3.1-next.1 - - @backstage/plugin-kubernetes-backend@0.13.1-next.1 - - @backstage/plugin-lighthouse-backend@0.3.4-next.1 - - @backstage/plugin-linguist-backend@0.5.4-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.11-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.1 - - @backstage/plugin-todo-backend@0.3.5-next.1 - - @backstage/plugin-adr-backend@0.4.4-next.1 - - @backstage/backend-defaults@0.2.7-next.1 - - @backstage/backend-tasks@0.5.12-next.1 - - @backstage/plugin-app-backend@0.3.55-next.1 - - @backstage/plugin-auth-node@0.4.1-next.1 - - @backstage/plugin-badges-backend@0.3.4-next.1 - - @backstage/plugin-entity-feedback-backend@0.2.4-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4-next.1 - - @backstage/plugin-permission-node@0.7.18-next.1 - - @backstage/plugin-playlist-backend@0.3.11-next.1 - - @backstage/plugin-proxy-backend@0.4.5-next.1 - - @backstage/plugin-search-backend@1.4.7-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.11-next.1 - - @backstage/plugin-sonarqube-backend@0.2.9-next.1 - - @backstage/plugin-azure-devops-backend@0.4.4-next.1 - - @backstage/plugin-devtools-backend@0.2.4-next.1 - - @backstage/plugin-nomad-backend@0.1.9-next.1 - - @backstage/plugin-permission-backend@0.5.30-next.1 - - @backstage/plugin-search-backend-node@1.2.11-next.1 - - @backstage/backend-plugin-api@0.6.7-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.1 - - @backstage/plugin-permission-common@0.7.9 - -## 0.0.17-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend-node@1.2.11-next.0 - - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0-next.0 - - @backstage/plugin-techdocs-backend@1.8.1-next.0 - - @backstage/plugin-scaffolder-backend@1.19.0-next.0 - - @backstage/plugin-catalog-backend@1.15.0-next.0 - - @backstage/plugin-search-backend@1.4.7-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.0 - - @backstage/plugin-proxy-backend@0.4.5-next.0 - - @backstage/plugin-app-backend@0.3.55-next.0 - - @backstage/plugin-devtools-backend@0.2.4-next.0 - - @backstage/backend-defaults@0.2.7-next.0 - - @backstage/backend-plugin-api@0.6.7-next.0 - - @backstage/backend-tasks@0.5.12-next.0 - - @backstage/plugin-adr-backend@0.4.4-next.0 - - @backstage/plugin-auth-node@0.4.1-next.0 - - @backstage/plugin-azure-devops-backend@0.4.4-next.0 - - @backstage/plugin-badges-backend@0.3.4-next.0 - - @backstage/plugin-catalog-backend-module-openapi@0.1.24-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.4-next.0 - - @backstage/plugin-jenkins-backend@0.3.1-next.0 - - @backstage/plugin-kubernetes-backend@0.13.1-next.0 - - @backstage/plugin-lighthouse-backend@0.3.4-next.0 - - @backstage/plugin-linguist-backend@0.5.4-next.0 - - @backstage/plugin-nomad-backend@0.1.9-next.0 - - @backstage/plugin-permission-backend@0.5.30-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4-next.0 - - @backstage/plugin-permission-common@0.7.9 - - @backstage/plugin-permission-node@0.7.18-next.0 - - @backstage/plugin-playlist-backend@0.3.11-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.11-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.11-next.0 - - @backstage/plugin-sonarqube-backend@0.2.9-next.0 - - @backstage/plugin-todo-backend@0.3.5-next.0 - -## 0.0.16 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-nomad-backend@0.1.8 - - @backstage/backend-tasks@0.5.11 - - @backstage/plugin-sonarqube-backend@0.2.8 - - @backstage/plugin-scaffolder-backend@1.18.0 - - @backstage/plugin-playlist-backend@0.3.10 - - @backstage/plugin-techdocs-backend@1.8.0 - - @backstage/plugin-catalog-backend@1.14.0 - - @backstage/plugin-auth-node@0.4.0 - - @backstage/plugin-badges-backend@0.3.3 - - @backstage/plugin-kubernetes-backend@0.13.0 - - @backstage/plugin-jenkins-backend@0.3.0 - - @backstage/plugin-search-backend@1.4.6 - - @backstage/backend-plugin-api@0.6.6 - - @backstage/plugin-lighthouse-backend@0.3.3 - - @backstage/plugin-linguist-backend@0.5.3 - - @backstage/plugin-search-backend-module-catalog@0.1.10 - - @backstage/plugin-search-backend-module-explore@0.1.10 - - @backstage/plugin-search-backend-module-techdocs@0.1.10 - - @backstage/plugin-search-backend-node@1.2.10 - - @backstage/backend-defaults@0.2.6 - - @backstage/plugin-adr-backend@0.4.3 - - @backstage/plugin-app-backend@0.3.54 - - @backstage/plugin-azure-devops-backend@0.4.3 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.3 - - @backstage/plugin-devtools-backend@0.2.3 - - @backstage/plugin-entity-feedback-backend@0.2.3 - - @backstage/plugin-permission-backend@0.5.29 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.3 - - @backstage/plugin-permission-node@0.7.17 - - @backstage/plugin-proxy-backend@0.4.3 - - @backstage/plugin-todo-backend@0.3.4 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.3 - - @backstage/plugin-permission-common@0.7.9 - -## 0.0.16-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-nomad-backend@0.1.8-next.2 - - @backstage/plugin-scaffolder-backend@1.18.0-next.2 - - @backstage/plugin-techdocs-backend@1.8.0-next.2 - - @backstage/plugin-auth-node@0.4.0-next.2 - - @backstage/plugin-catalog-backend@1.14.0-next.2 - - @backstage/plugin-kubernetes-backend@0.12.3-next.2 - - @backstage/plugin-jenkins-backend@0.2.9-next.2 - - @backstage/backend-defaults@0.2.6-next.2 - - @backstage/backend-tasks@0.5.11-next.2 - - @backstage/plugin-adr-backend@0.4.3-next.2 - - @backstage/plugin-app-backend@0.3.54-next.2 - - @backstage/plugin-azure-devops-backend@0.4.3-next.2 - - @backstage/plugin-badges-backend@0.3.3-next.2 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.3-next.2 - - @backstage/plugin-devtools-backend@0.2.3-next.2 - - @backstage/plugin-entity-feedback-backend@0.2.3-next.2 - - @backstage/plugin-lighthouse-backend@0.3.3-next.2 - - @backstage/plugin-linguist-backend@0.5.3-next.2 - - @backstage/plugin-permission-backend@0.5.29-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.3-next.2 - - @backstage/plugin-permission-node@0.7.17-next.2 - - @backstage/plugin-playlist-backend@0.3.10-next.2 - - @backstage/plugin-proxy-backend@0.4.3-next.2 - - @backstage/plugin-search-backend@1.4.6-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.10-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.10-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.10-next.2 - - @backstage/plugin-search-backend-node@1.2.10-next.2 - - @backstage/plugin-sonarqube-backend@0.2.8-next.2 - - @backstage/plugin-todo-backend@0.3.4-next.2 - - @backstage/backend-plugin-api@0.6.6-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.3-next.2 - - @backstage/plugin-permission-common@0.7.9-next.0 - -## 0.0.16-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-tasks@0.5.10-next.1 - - @backstage/plugin-catalog-backend@1.14.0-next.1 - - @backstage/plugin-scaffolder-backend@1.18.0-next.1 - - @backstage/plugin-badges-backend@0.3.2-next.1 - - @backstage/backend-plugin-api@0.6.5-next.1 - - @backstage/plugin-lighthouse-backend@0.3.2-next.1 - - @backstage/plugin-linguist-backend@0.5.2-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.9-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.9-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.1 - - @backstage/plugin-search-backend-node@1.2.9-next.1 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.1 - - @backstage/plugin-kubernetes-backend@0.12.2-next.1 - - @backstage/plugin-todo-backend@0.3.3-next.1 - - @backstage/backend-defaults@0.2.5-next.1 - - @backstage/plugin-adr-backend@0.4.2-next.1 - - @backstage/plugin-app-backend@0.3.53-next.1 - - @backstage/plugin-auth-node@0.3.2-next.1 - - @backstage/plugin-azure-devops-backend@0.4.2-next.1 - - @backstage/plugin-devtools-backend@0.2.2-next.1 - - @backstage/plugin-entity-feedback-backend@0.2.2-next.1 - - @backstage/plugin-permission-backend@0.5.28-next.1 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.2-next.1 - - @backstage/plugin-permission-node@0.7.16-next.1 - - @backstage/plugin-playlist-backend@0.3.9-next.1 - - @backstage/plugin-proxy-backend@0.4.2-next.1 - - @backstage/plugin-search-backend@1.4.5-next.1 - - @backstage/plugin-sonarqube-backend@0.2.7-next.1 - - @backstage/plugin-techdocs-backend@1.7.2-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.1 - - @backstage/plugin-permission-common@0.7.8 - -## 0.0.16-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-sonarqube-backend@0.2.7-next.0 - - @backstage/plugin-playlist-backend@0.3.9-next.0 - - @backstage/plugin-catalog-backend@1.14.0-next.0 - - @backstage/plugin-auth-node@0.3.2-next.0 - - @backstage/plugin-adr-backend@0.4.2-next.0 - - @backstage/plugin-scaffolder-backend@1.17.3-next.0 - - @backstage/plugin-techdocs-backend@1.7.2-next.0 - - @backstage/plugin-todo-backend@0.3.3-next.0 - - @backstage/backend-defaults@0.2.5-next.0 - - @backstage/backend-plugin-api@0.6.5-next.0 - - @backstage/backend-tasks@0.5.10-next.0 - - @backstage/plugin-app-backend@0.3.53-next.0 - - @backstage/plugin-azure-devops-backend@0.4.2-next.0 - - @backstage/plugin-badges-backend@0.3.2-next.0 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.0 - - @backstage/plugin-devtools-backend@0.2.2-next.0 - - @backstage/plugin-entity-feedback-backend@0.2.2-next.0 - - @backstage/plugin-kubernetes-backend@0.12.2-next.0 - - @backstage/plugin-lighthouse-backend@0.3.2-next.0 - - @backstage/plugin-linguist-backend@0.5.2-next.0 - - @backstage/plugin-permission-backend@0.5.28-next.0 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.2-next.0 - - @backstage/plugin-permission-common@0.7.8 - - @backstage/plugin-permission-node@0.7.16-next.0 - - @backstage/plugin-proxy-backend@0.4.2-next.0 - - @backstage/plugin-search-backend@1.4.5-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.9-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.9-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.0 - - @backstage/plugin-search-backend-node@1.2.9-next.0 - -## 0.0.15 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.13.0 - - @backstage/plugin-kubernetes-backend@0.12.0 - - @backstage/plugin-techdocs-backend@1.7.0 - - @backstage/plugin-proxy-backend@0.4.0 - - @backstage/plugin-adr-backend@0.4.0 - - @backstage/plugin-azure-devops-backend@0.4.0 - - @backstage/plugin-badges-backend@0.3.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 - - @backstage/plugin-devtools-backend@0.2.0 - - @backstage/plugin-entity-feedback-backend@0.2.0 - - @backstage/plugin-lighthouse-backend@0.3.0 - - @backstage/plugin-linguist-backend@0.5.0 - - @backstage/plugin-todo-backend@0.3.0 - - @backstage/plugin-app-backend@0.3.51 - - @backstage/plugin-permission-backend@0.5.26 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0 - - @backstage/plugin-scaffolder-backend@1.17.0 - - @backstage/plugin-search-backend@1.4.3 - - @backstage/plugin-search-backend-module-catalog@0.1.7 - - @backstage/plugin-search-backend-module-explore@0.1.7 - - @backstage/plugin-search-backend-module-techdocs@0.1.7 - - @backstage/backend-tasks@0.5.8 - - @backstage/plugin-auth-node@0.3.0 - - @backstage/plugin-permission-common@0.7.8 - - @backstage/plugin-permission-node@0.7.14 - - @backstage/backend-plugin-api@0.6.3 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 - - @backstage/backend-defaults@0.2.3 - - @backstage/plugin-search-backend-node@1.2.7 - -## 0.0.15-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-techdocs-backend@1.7.0-next.3 - - @backstage/plugin-proxy-backend@0.4.0-next.3 - - @backstage/plugin-adr-backend@0.4.0-next.3 - - @backstage/plugin-azure-devops-backend@0.4.0-next.3 - - @backstage/plugin-badges-backend@0.3.0-next.3 - - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0-next.3 - - @backstage/plugin-devtools-backend@0.2.0-next.3 - - @backstage/plugin-entity-feedback-backend@0.2.0-next.3 - - @backstage/plugin-lighthouse-backend@0.3.0-next.3 - - @backstage/plugin-linguist-backend@0.5.0-next.3 - - @backstage/plugin-todo-backend@0.3.0-next.3 - - @backstage/plugin-app-backend@0.3.51-next.3 - - @backstage/plugin-catalog-backend@1.13.0-next.3 - - @backstage/plugin-kubernetes-backend@0.11.6-next.3 - - @backstage/plugin-permission-backend@0.5.26-next.3 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0-next.1 - - @backstage/plugin-scaffolder-backend@1.17.0-next.3 - - @backstage/plugin-search-backend@1.4.3-next.3 - - @backstage/plugin-search-backend-module-catalog@0.1.7-next.3 - - @backstage/plugin-search-backend-module-explore@0.1.7-next.3 - - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.3 - - @backstage/plugin-permission-common@0.7.8-next.2 - - @backstage/plugin-permission-node@0.7.14-next.3 - - @backstage/backend-plugin-api@0.6.3-next.3 - - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0-next.0 - - @backstage/backend-defaults@0.2.3-next.3 - - @backstage/backend-tasks@0.5.8-next.3 - - @backstage/plugin-auth-node@0.3.0-next.3 - - @backstage/plugin-search-backend-node@1.2.7-next.3 - -## 0.0.15-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.16.6-next.2 - - @backstage/plugin-permission-backend@0.5.26-next.2 - - @backstage/plugin-catalog-backend@1.13.0-next.2 - - @backstage/plugin-badges-backend@0.2.6-next.2 - - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0-next.0 - - @backstage/backend-tasks@0.5.8-next.2 - - @backstage/backend-defaults@0.2.3-next.2 - - @backstage/plugin-app-backend@0.3.51-next.2 - - @backstage/plugin-auth-node@0.3.0-next.2 - - @backstage/plugin-entity-feedback-backend@0.1.9-next.2 - - @backstage/plugin-kubernetes-backend@0.11.6-next.2 - - @backstage/plugin-linguist-backend@0.4.3-next.2 - - @backstage/plugin-permission-node@0.7.14-next.2 - - @backstage/plugin-proxy-backend@0.3.3-next.2 - - @backstage/plugin-search-backend@1.4.3-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.7-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.7-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.2 - - @backstage/plugin-techdocs-backend@1.7.0-next.2 - - @backstage/plugin-devtools-backend@0.1.6-next.2 - - @backstage/backend-plugin-api@0.6.3-next.2 - - @backstage/plugin-adr-backend@0.3.9-next.2 - - @backstage/plugin-azure-devops-backend@0.3.30-next.2 - - @backstage/plugin-lighthouse-backend@0.2.7-next.2 - - @backstage/plugin-permission-common@0.7.8-next.1 - - @backstage/plugin-search-backend-node@1.2.7-next.2 - - @backstage/plugin-todo-backend@0.2.3-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.3-next.2 - -## 0.0.15-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.11.6-next.1 - - @backstage/plugin-catalog-backend@1.13.0-next.1 - - @backstage/plugin-devtools-backend@0.1.6-next.1 - - @backstage/backend-tasks@0.5.8-next.1 - - @backstage/plugin-techdocs-backend@1.7.0-next.1 - - @backstage/plugin-scaffolder-backend@1.16.6-next.1 - - @backstage/backend-plugin-api@0.6.3-next.1 - - @backstage/plugin-adr-backend@0.3.9-next.1 - - @backstage/plugin-app-backend@0.3.51-next.1 - - @backstage/plugin-auth-node@0.3.0-next.1 - - @backstage/plugin-azure-devops-backend@0.3.30-next.1 - - @backstage/plugin-badges-backend@0.2.6-next.1 - - @backstage/plugin-entity-feedback-backend@0.1.9-next.1 - - @backstage/plugin-lighthouse-backend@0.2.7-next.1 - - @backstage/plugin-linguist-backend@0.4.3-next.1 - - @backstage/plugin-permission-backend@0.5.26-next.1 - - @backstage/plugin-permission-common@0.7.8-next.0 - - @backstage/plugin-permission-node@0.7.14-next.1 - - @backstage/plugin-proxy-backend@0.3.3-next.1 - - @backstage/plugin-search-backend@1.4.3-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.7-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.7-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.1 - - @backstage/plugin-search-backend-node@1.2.7-next.1 - - @backstage/plugin-todo-backend@0.2.3-next.1 - - @backstage/backend-defaults@0.2.3-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.3-next.1 - -## 0.0.15-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.12.2-next.0 - - @backstage/plugin-scaffolder-backend@1.16.3-next.0 - - @backstage/plugin-auth-node@0.3.0-next.0 - - @backstage/plugin-linguist-backend@0.4.2-next.0 - - @backstage/plugin-entity-feedback-backend@0.1.8-next.0 - - @backstage/backend-tasks@0.5.7-next.0 - - @backstage/plugin-app-backend@0.3.50-next.0 - - @backstage/backend-defaults@0.2.2-next.0 - - @backstage/backend-plugin-api@0.6.2-next.0 - - @backstage/plugin-adr-backend@0.3.8-next.0 - - @backstage/plugin-azure-devops-backend@0.3.29-next.0 - - @backstage/plugin-badges-backend@0.2.5-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.2-next.0 - - @backstage/plugin-devtools-backend@0.1.5-next.0 - - @backstage/plugin-kubernetes-backend@0.11.5-next.0 - - @backstage/plugin-lighthouse-backend@0.2.6-next.0 - - @backstage/plugin-permission-backend@0.5.25-next.0 - - @backstage/plugin-permission-common@0.7.7 - - @backstage/plugin-permission-node@0.7.13-next.0 - - @backstage/plugin-proxy-backend@0.3.2-next.0 - - @backstage/plugin-search-backend@1.4.2-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.6-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.6-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.6-next.0 - - @backstage/plugin-search-backend-node@1.2.6-next.0 - - @backstage/plugin-techdocs-backend@1.6.7-next.0 - - @backstage/plugin-todo-backend@0.2.2-next.0 - -## 0.0.14 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend-module-techdocs@0.1.4 - - @backstage/plugin-search-backend-module-catalog@0.1.4 - - @backstage/plugin-search-backend-module-explore@0.1.4 - - @backstage/plugin-azure-devops-backend@0.3.27 - - @backstage/plugin-kubernetes-backend@0.11.3 - - @backstage/plugin-lighthouse-backend@0.2.4 - - @backstage/plugin-permission-backend@0.5.23 - - @backstage/plugin-scaffolder-backend@1.16.0 - - @backstage/backend-defaults@0.2.0 - - @backstage/plugin-devtools-backend@0.1.3 - - @backstage/plugin-techdocs-backend@1.6.5 - - @backstage/plugin-catalog-backend@1.12.0 - - @backstage/plugin-badges-backend@0.2.3 - - @backstage/plugin-search-backend@1.4.0 - - @backstage/plugin-proxy-backend@0.3.0 - - @backstage/plugin-todo-backend@0.2.0 - - @backstage/plugin-app-backend@0.3.48 - - @backstage/backend-plugin-api@0.6.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0 - - @backstage/plugin-entity-feedback-backend@0.1.6 - - @backstage/plugin-search-backend-node@1.2.4 - - @backstage/plugin-linguist-backend@0.4.0 - - @backstage/plugin-auth-node@0.2.17 - - @backstage/backend-tasks@0.5.5 - - @backstage/plugin-adr-backend@0.3.6 - - @backstage/plugin-permission-node@0.7.11 - - @backstage/plugin-permission-common@0.7.7 - -## 0.0.14-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.4-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.4-next.2 - - @backstage/plugin-scaffolder-backend@1.15.2-next.2 - - @backstage/plugin-catalog-backend@1.12.0-next.2 - - @backstage/backend-plugin-api@0.6.0-next.2 - - @backstage/plugin-proxy-backend@0.3.0-next.2 - - @backstage/backend-tasks@0.5.5-next.2 - - @backstage/plugin-app-backend@0.3.48-next.2 - - @backstage/plugin-linguist-backend@0.4.0-next.2 - - @backstage/plugin-techdocs-backend@1.6.5-next.2 - - @backstage/backend-defaults@0.2.0-next.2 - - @backstage/plugin-adr-backend@0.3.6-next.2 - - @backstage/plugin-azure-devops-backend@0.3.27-next.2 - - @backstage/plugin-badges-backend@0.2.3-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.2 - - @backstage/plugin-devtools-backend@0.1.3-next.2 - - @backstage/plugin-entity-feedback-backend@0.1.6-next.2 - - @backstage/plugin-kubernetes-backend@0.11.3-next.2 - - @backstage/plugin-lighthouse-backend@0.2.4-next.2 - - @backstage/plugin-permission-backend@0.5.23-next.2 - - @backstage/plugin-permission-node@0.7.11-next.2 - - @backstage/plugin-search-backend@1.4.0-next.2 - - @backstage/plugin-search-backend-node@1.2.4-next.2 - - @backstage/plugin-todo-backend@0.2.0-next.2 - - @backstage/plugin-auth-node@0.2.17-next.2 - -## 0.0.14-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.4-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.4-next.1 - - @backstage/plugin-azure-devops-backend@0.3.27-next.1 - - @backstage/plugin-kubernetes-backend@0.11.3-next.1 - - @backstage/plugin-lighthouse-backend@0.2.4-next.1 - - @backstage/plugin-permission-backend@0.5.23-next.1 - - @backstage/plugin-scaffolder-backend@1.15.2-next.1 - - @backstage/backend-defaults@0.2.0-next.1 - - @backstage/plugin-devtools-backend@0.1.3-next.1 - - @backstage/plugin-techdocs-backend@1.6.5-next.1 - - @backstage/plugin-catalog-backend@1.12.0-next.1 - - @backstage/plugin-badges-backend@0.2.3-next.1 - - @backstage/plugin-search-backend@1.4.0-next.1 - - @backstage/plugin-todo-backend@0.2.0-next.1 - - @backstage/plugin-app-backend@0.3.48-next.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.1 - - @backstage/plugin-entity-feedback-backend@0.1.6-next.1 - - @backstage/plugin-search-backend-node@1.2.4-next.1 - - @backstage/plugin-linguist-backend@0.3.2-next.1 - - @backstage/plugin-auth-node@0.2.17-next.1 - - @backstage/backend-tasks@0.5.5-next.1 - - @backstage/plugin-adr-backend@0.3.6-next.1 - - @backstage/plugin-permission-node@0.7.11-next.1 - - @backstage/plugin-permission-common@0.7.7 - -## 0.0.14-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-linguist-backend@0.3.2-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.0 - - @backstage/plugin-search-backend-node@1.2.4-next.0 - - @backstage/plugin-todo-backend@0.2.0-next.0 - - @backstage/plugin-catalog-backend@1.12.0-next.0 - - @backstage/plugin-search-backend@1.4.0-next.0 - - @backstage/backend-defaults@0.1.13-next.0 - - @backstage/backend-tasks@0.5.5-next.0 - - @backstage/plugin-adr-backend@0.3.6-next.0 - - @backstage/plugin-app-backend@0.3.48-next.0 - - @backstage/plugin-auth-node@0.2.17-next.0 - - @backstage/plugin-azure-devops-backend@0.3.27-next.0 - - @backstage/plugin-badges-backend@0.2.3-next.0 - - @backstage/plugin-devtools-backend@0.1.3-next.0 - - @backstage/plugin-entity-feedback-backend@0.1.6-next.0 - - @backstage/plugin-kubernetes-backend@0.11.3-next.0 - - @backstage/plugin-lighthouse-backend@0.2.4-next.0 - - @backstage/plugin-permission-backend@0.5.23-next.0 - - @backstage/plugin-permission-common@0.7.7 - - @backstage/plugin-permission-node@0.7.11-next.0 - - @backstage/plugin-scaffolder-backend@1.15.2-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.4-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.4-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.0 - - @backstage/plugin-techdocs-backend@1.6.5-next.0 - -## 0.0.13 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.11.2 - - @backstage/plugin-badges-backend@0.2.2 - - @backstage/plugin-devtools-backend@0.1.2 - - @backstage/plugin-scaffolder-backend@1.15.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1 - - @backstage/plugin-azure-devops-backend@0.3.26 - - @backstage/plugin-linguist-backend@0.3.1 - - @backstage/plugin-adr-backend@0.3.5 - - @backstage/plugin-lighthouse-backend@0.2.3 - - @backstage/plugin-entity-feedback-backend@0.1.5 - - @backstage/plugin-catalog-backend@1.11.0 - - @backstage/backend-defaults@0.1.12 - - @backstage/backend-tasks@0.5.4 - - @backstage/plugin-app-backend@0.3.47 - - @backstage/plugin-auth-node@0.2.16 - - @backstage/plugin-permission-backend@0.5.22 - - @backstage/plugin-permission-common@0.7.7 - - @backstage/plugin-permission-node@0.7.10 - - @backstage/plugin-search-backend@1.3.3 - - @backstage/plugin-search-backend-module-catalog@0.1.3 - - @backstage/plugin-search-backend-module-explore@0.1.3 - - @backstage/plugin-search-backend-module-techdocs@0.1.3 - - @backstage/plugin-search-backend-node@1.2.3 - - @backstage/plugin-techdocs-backend@1.6.4 - - @backstage/plugin-todo-backend@0.1.44 - -## 0.0.13-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-devtools-backend@0.1.2-next.2 - - @backstage/plugin-scaffolder-backend@1.15.1-next.1 - - @backstage/plugin-kubernetes-backend@0.11.2-next.2 - - @backstage/plugin-adr-backend@0.3.5-next.1 - - @backstage/backend-defaults@0.1.12-next.0 - - @backstage/backend-tasks@0.5.4-next.0 - - @backstage/plugin-app-backend@0.3.47-next.0 - - @backstage/plugin-auth-node@0.2.16-next.0 - - @backstage/plugin-azure-devops-backend@0.3.26-next.1 - - @backstage/plugin-badges-backend@0.2.2-next.1 - - @backstage/plugin-catalog-backend@1.11.0-next.0 - - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1-next.0 - - @backstage/plugin-entity-feedback-backend@0.1.5-next.0 - - @backstage/plugin-linguist-backend@0.3.1-next.1 - - @backstage/plugin-permission-backend@0.5.22-next.0 - - @backstage/plugin-permission-common@0.7.7-next.0 - - @backstage/plugin-permission-node@0.7.10-next.0 - - @backstage/plugin-search-backend@1.3.3-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.3-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.3-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.3-next.0 - - @backstage/plugin-search-backend-node@1.2.3-next.0 - - @backstage/plugin-techdocs-backend@1.6.4-next.0 - - @backstage/plugin-todo-backend@0.1.44-next.0 - -## 0.0.13-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.11.2-next.1 - - @backstage/plugin-badges-backend@0.2.2-next.1 - - @backstage/plugin-azure-devops-backend@0.3.26-next.1 - - @backstage/plugin-devtools-backend@0.1.2-next.1 - - @backstage/plugin-linguist-backend@0.3.1-next.1 - -## 0.0.13-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1-next.0 - - @backstage/plugin-entity-feedback-backend@0.1.5-next.0 - - @backstage/plugin-catalog-backend@1.11.0-next.0 - - @backstage/plugin-kubernetes-backend@0.11.2-next.0 - - @backstage/backend-defaults@0.1.12-next.0 - - @backstage/plugin-app-backend@0.3.47-next.0 - - @backstage/plugin-auth-node@0.2.16-next.0 - - @backstage/plugin-permission-backend@0.5.22-next.0 - - @backstage/plugin-permission-common@0.7.7-next.0 - - @backstage/plugin-permission-node@0.7.10-next.0 - - @backstage/plugin-scaffolder-backend@1.15.1-next.0 - - @backstage/plugin-search-backend@1.3.3-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.3-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.3-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.3-next.0 - - @backstage/plugin-search-backend-node@1.2.3-next.0 - - @backstage/plugin-techdocs-backend@1.6.4-next.0 - - @backstage/plugin-todo-backend@0.1.44-next.0 - -## 0.0.12 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.15.0 - - @backstage/plugin-kubernetes-backend@0.11.1 - - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0 - - @backstage/plugin-catalog-backend@1.10.0 - - @backstage/plugin-search-backend@1.3.2 - - @backstage/plugin-search-backend-module-explore@0.1.2 - - @backstage/backend-defaults@0.1.11 - - @backstage/plugin-app-backend@0.3.46 - - @backstage/plugin-auth-node@0.2.15 - - @backstage/plugin-permission-backend@0.5.21 - - @backstage/plugin-permission-node@0.7.9 - - @backstage/plugin-search-backend-module-catalog@0.1.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.2 - - @backstage/plugin-search-backend-node@1.2.2 - - @backstage/plugin-techdocs-backend@1.6.3 - - @backstage/plugin-todo-backend@0.1.43 - - @backstage/plugin-permission-common@0.7.6 - -## 0.0.12-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.15.0-next.3 - - @backstage/plugin-kubernetes-backend@0.11.1-next.3 - - @backstage/plugin-catalog-backend@1.10.0-next.2 - - @backstage/backend-defaults@0.1.11-next.2 - - @backstage/plugin-app-backend@0.3.46-next.2 - - @backstage/plugin-auth-node@0.2.15-next.2 - - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.1 - - @backstage/plugin-permission-backend@0.5.21-next.2 - - @backstage/plugin-permission-common@0.7.6-next.0 - - @backstage/plugin-permission-node@0.7.9-next.2 - - @backstage/plugin-search-backend@1.3.2-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.2-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.2-next.2 - - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.2 - - @backstage/plugin-search-backend-node@1.2.2-next.2 - - @backstage/plugin-techdocs-backend@1.6.3-next.2 - - @backstage/plugin-todo-backend@0.1.43-next.2 - -## 0.0.12-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.11.1-next.2 - - @backstage/plugin-scaffolder-backend@1.15.0-next.2 - -## 0.0.12-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.0 - - @backstage/plugin-catalog-backend@1.9.2-next.1 - - @backstage/plugin-scaffolder-backend@1.15.0-next.1 - - @backstage/backend-defaults@0.1.11-next.1 - - @backstage/plugin-app-backend@0.3.46-next.1 - - @backstage/plugin-auth-node@0.2.15-next.1 - - @backstage/plugin-kubernetes-backend@0.11.1-next.1 - - @backstage/plugin-permission-backend@0.5.21-next.1 - - @backstage/plugin-permission-node@0.7.9-next.1 - - @backstage/plugin-search-backend@1.3.2-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.2-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.2-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.1 - - @backstage/plugin-search-backend-node@1.2.2-next.1 - - @backstage/plugin-techdocs-backend@1.6.3-next.1 - - @backstage/plugin-todo-backend@0.1.43-next.1 - - @backstage/plugin-permission-common@0.7.6-next.0 - -## 0.0.12-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.14.1-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.2-next.0 - - @backstage/plugin-catalog-backend@1.9.2-next.0 - - @backstage/plugin-kubernetes-backend@0.11.1-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.2-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.0 - - @backstage/plugin-techdocs-backend@1.6.3-next.0 - - @backstage/plugin-todo-backend@0.1.43-next.0 - - @backstage/plugin-app-backend@0.3.46-next.0 - - @backstage/backend-defaults@0.1.11-next.0 - - @backstage/plugin-auth-node@0.2.15-next.0 - - @backstage/plugin-permission-backend@0.5.21-next.0 - - @backstage/plugin-permission-common@0.7.5 - - @backstage/plugin-permission-node@0.7.9-next.0 - - @backstage/plugin-search-backend@1.3.2-next.0 - - @backstage/plugin-search-backend-node@1.2.2-next.0 - -## 0.0.11 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.14.0 - - @backstage/plugin-catalog-backend@1.9.1 - - @backstage/plugin-kubernetes-backend@0.11.0 - - @backstage/plugin-todo-backend@0.1.42 - - @backstage/plugin-permission-node@0.7.8 - - @backstage/plugin-search-backend@1.3.1 - - @backstage/backend-defaults@0.1.10 - - @backstage/plugin-app-backend@0.3.45 - - @backstage/plugin-auth-node@0.2.14 - - @backstage/plugin-search-backend-module-catalog@0.1.1 - - @backstage/plugin-search-backend-module-explore@0.1.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.1 - - @backstage/plugin-techdocs-backend@1.6.2 - - @backstage/plugin-permission-backend@0.5.20 - - @backstage/plugin-search-backend-node@1.2.1 - - @backstage/plugin-permission-common@0.7.5 - -## 0.0.11-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.9.1-next.2 - - @backstage/plugin-kubernetes-backend@0.11.0-next.2 - - @backstage/plugin-search-backend@1.3.1-next.2 - - @backstage/plugin-scaffolder-backend@1.13.2-next.2 - -## 0.0.11-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.11.0-next.1 - - @backstage/plugin-catalog-backend@1.9.1-next.1 - - @backstage/plugin-scaffolder-backend@1.13.2-next.1 - - @backstage/backend-defaults@0.1.10-next.1 - - @backstage/plugin-app-backend@0.3.45-next.1 - - @backstage/plugin-auth-node@0.2.14-next.1 - - @backstage/plugin-permission-backend@0.5.20-next.1 - - @backstage/plugin-permission-node@0.7.8-next.1 - - @backstage/plugin-search-backend@1.3.1-next.1 - - @backstage/plugin-search-backend-module-catalog@0.1.1-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.1-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.1-next.1 - - @backstage/plugin-search-backend-node@1.2.1-next.1 - - @backstage/plugin-techdocs-backend@1.6.2-next.1 - - @backstage/plugin-todo-backend@0.1.42-next.1 - -## 0.0.11-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-permission-node@0.7.8-next.0 - - @backstage/plugin-scaffolder-backend@1.13.2-next.0 - - @backstage/plugin-kubernetes-backend@0.11.0-next.0 - - @backstage/backend-defaults@0.1.10-next.0 - - @backstage/plugin-app-backend@0.3.45-next.0 - - @backstage/plugin-auth-node@0.2.14-next.0 - - @backstage/plugin-catalog-backend@1.9.1-next.0 - - @backstage/plugin-search-backend@1.3.1-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.1-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.1-next.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.1-next.0 - - @backstage/plugin-techdocs-backend@1.6.2-next.0 - - @backstage/plugin-permission-backend@0.5.20-next.0 - - @backstage/plugin-search-backend-node@1.2.1-next.0 - - @backstage/plugin-todo-backend@0.1.42-next.0 - - @backstage/plugin-permission-common@0.7.5 - -## 0.0.10 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.10.0 - - @backstage/plugin-scaffolder-backend@1.13.0 - - @backstage/plugin-catalog-backend@1.9.0 - - @backstage/plugin-permission-node@0.7.7 - - @backstage/plugin-permission-backend@0.5.19 - - @backstage/plugin-search-backend@1.3.0 - - @backstage/plugin-permission-common@0.7.5 - - @backstage/plugin-techdocs-backend@1.6.1 - - @backstage/plugin-search-backend-node@1.2.0 - - @backstage/plugin-search-backend-module-techdocs@0.1.0 - - @backstage/plugin-search-backend-module-catalog@0.1.0 - - @backstage/plugin-search-backend-module-explore@0.1.0 - - @backstage/backend-defaults@0.1.9 - - @backstage/plugin-app-backend@0.3.44 - - @backstage/plugin-auth-node@0.2.13 - - @backstage/plugin-todo-backend@0.1.41 - -## 0.0.10-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.10.0-next.3 - - @backstage/plugin-catalog-backend@1.9.0-next.3 - - @backstage/plugin-scaffolder-backend@1.13.0-next.3 - - @backstage/backend-defaults@0.1.9-next.2 - - @backstage/plugin-app-backend@0.3.44-next.2 - - @backstage/plugin-auth-node@0.2.13-next.2 - - @backstage/plugin-permission-backend@0.5.19-next.2 - - @backstage/plugin-permission-common@0.7.5-next.0 - - @backstage/plugin-permission-node@0.7.7-next.2 - - @backstage/plugin-search-backend@1.3.0-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.0-next.2 - - @backstage/plugin-search-backend-module-explore@0.1.0-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.2 - - @backstage/plugin-search-backend-node@1.2.0-next.2 - - @backstage/plugin-techdocs-backend@1.6.1-next.3 - - @backstage/plugin-todo-backend@0.1.41-next.3 - -## 0.0.10-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.10.0-next.2 - - @backstage/plugin-catalog-backend@1.8.1-next.2 - - @backstage/plugin-permission-node@0.7.7-next.2 - - @backstage/plugin-permission-backend@0.5.19-next.2 - - @backstage/plugin-scaffolder-backend@1.13.0-next.2 - - @backstage/backend-defaults@0.1.9-next.2 - - @backstage/plugin-app-backend@0.3.44-next.2 - - @backstage/plugin-auth-node@0.2.13-next.2 - - @backstage/plugin-permission-common@0.7.5-next.0 - - @backstage/plugin-search-backend@1.3.0-next.2 - - @backstage/plugin-search-backend-module-catalog@0.1.0-next.1 - - @backstage/plugin-search-backend-module-explore@0.1.0-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.1 - - @backstage/plugin-search-backend-node@1.2.0-next.2 - - @backstage/plugin-techdocs-backend@1.6.1-next.2 - - @backstage/plugin-todo-backend@0.1.41-next.2 - -## 0.0.10-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend@1.3.0-next.1 - - @backstage/plugin-scaffolder-backend@1.13.0-next.1 - - @backstage/plugin-catalog-backend@1.8.1-next.1 - - @backstage/plugin-kubernetes-backend@0.10.0-next.1 - - @backstage/plugin-techdocs-backend@1.6.1-next.1 - - @backstage/plugin-search-backend-node@1.2.0-next.1 - - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.0 - - @backstage/plugin-search-backend-module-catalog@0.1.0-next.0 - - @backstage/plugin-search-backend-module-explore@0.1.0-next.0 - - @backstage/backend-defaults@0.1.9-next.1 - - @backstage/plugin-app-backend@0.3.44-next.1 - - @backstage/plugin-todo-backend@0.1.41-next.1 - -## 0.0.10-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.12.1-next.0 - - @backstage/plugin-catalog-backend@1.8.1-next.0 - - @backstage/backend-defaults@0.1.9-next.0 - - @backstage/plugin-app-backend@0.3.44-next.0 - - @backstage/plugin-techdocs-backend@1.6.1-next.0 - - @backstage/plugin-todo-backend@0.1.41-next.0 - -## 0.0.9 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.12.0 - - @backstage/plugin-catalog-backend@1.8.0 - - @backstage/plugin-todo-backend@0.1.40 - - @backstage/plugin-techdocs-backend@1.6.0 - - @backstage/backend-defaults@0.1.8 - - @backstage/plugin-app-backend@0.3.43 - -## 0.0.9-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.12.0-next.2 - - @backstage/backend-defaults@0.1.8-next.2 - - @backstage/plugin-app-backend@0.3.43-next.2 - - @backstage/plugin-catalog-backend@1.8.0-next.2 - - @backstage/plugin-todo-backend@0.1.40-next.2 - -## 0.0.9-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.12.0-next.1 - - @backstage/plugin-app-backend@0.3.43-next.1 - - @backstage/plugin-catalog-backend@1.8.0-next.1 - - @backstage/plugin-todo-backend@0.1.40-next.1 - - @backstage/backend-defaults@0.1.8-next.1 - -## 0.0.9-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-todo-backend@0.1.40-next.0 - - @backstage/plugin-scaffolder-backend@1.11.1-next.0 - - @backstage/plugin-catalog-backend@1.8.0-next.0 - - @backstage/backend-defaults@0.1.8-next.0 - - @backstage/plugin-app-backend@0.3.43-next.0 - -## 0.0.8 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.7.2 - - @backstage/plugin-scaffolder-backend@1.11.0 - - @backstage/plugin-app-backend@0.3.42 - - @backstage/backend-defaults@0.1.7 - -## 0.0.8-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.7.2-next.2 - - @backstage/plugin-scaffolder-backend@1.11.0-next.2 - - @backstage/plugin-app-backend@0.3.42-next.2 - - @backstage/backend-defaults@0.1.7-next.2 - -## 0.0.8-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.7.2-next.1 - - @backstage/plugin-scaffolder-backend@1.11.0-next.1 - - @backstage/backend-defaults@0.1.7-next.1 - - @backstage/plugin-app-backend@0.3.42-next.1 - -## 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 - -## 0.0.7 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.10.0 - - @backstage/backend-defaults@0.1.5 - - @backstage/plugin-app-backend@0.3.40 - - @backstage/plugin-catalog-backend@1.7.0 - -## 0.0.7-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-defaults@0.1.5-next.1 - - @backstage/plugin-scaffolder-backend@1.10.0-next.2 - - @backstage/plugin-catalog-backend@1.7.0-next.2 - - @backstage/plugin-app-backend@0.3.40-next.1 - -## 0.0.7-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-defaults@0.1.5-next.0 - - @backstage/plugin-scaffolder-backend@1.10.0-next.1 - - @backstage/plugin-app-backend@0.3.40-next.0 - - @backstage/plugin-catalog-backend@1.7.0-next.1 - -## 0.0.7-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.9.1-next.0 - - @backstage/plugin-catalog-backend@1.7.0-next.0 - - @backstage/backend-defaults@0.1.4 - - @backstage/plugin-app-backend@0.3.39 - -## 0.0.6 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.9.0 - - @backstage/plugin-catalog-backend@1.6.0 - - @backstage/plugin-app-backend@0.3.39 - - @backstage/backend-defaults@0.1.4 - -## 0.0.6-next.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.6.0-next.3 - - @backstage/plugin-scaffolder-backend@1.9.0-next.3 - - @backstage/backend-defaults@0.1.4-next.3 - - @backstage/plugin-app-backend@0.3.39-next.3 - -## 0.0.6-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.6.0-next.2 - - @backstage/plugin-app-backend@0.3.39-next.2 - - @backstage/plugin-scaffolder-backend@1.9.0-next.2 - - @backstage/backend-defaults@0.1.4-next.2 - -## 0.0.6-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.6.0-next.1 - - @backstage/plugin-scaffolder-backend@1.8.1-next.1 - - @backstage/plugin-app-backend@0.3.39-next.1 - - @backstage/backend-defaults@0.1.4-next.1 - -## 0.0.6-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.8.1-next.0 - - @backstage/plugin-catalog-backend@1.6.0-next.0 - - @backstage/plugin-app-backend@0.3.39-next.0 - - @backstage/backend-defaults@0.1.4-next.0 - -## 0.0.5 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.5.1 - - @backstage/plugin-scaffolder-backend@1.8.0 - - @backstage/plugin-app-backend@0.3.38 - - @backstage/backend-defaults@0.1.3 - -## 0.0.5-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.8.0-next.2 - - @backstage/plugin-app-backend@0.3.38-next.1 - - @backstage/plugin-catalog-backend@1.5.1-next.1 - - @backstage/backend-defaults@0.1.3-next.1 - -## 0.0.5-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.8.0-next.1 - -## 0.0.5-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.5.1-next.0 - - @backstage/plugin-scaffolder-backend@1.8.0-next.0 - - @backstage/plugin-app-backend@0.3.38-next.0 - - @backstage/backend-defaults@0.1.3-next.0 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.5.0 - - @backstage/plugin-scaffolder-backend@1.7.0 - - @backstage/backend-defaults@0.1.2 - - @backstage/plugin-app-backend@0.3.37 - -## 0.0.4-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.5.0-next.2 - - @backstage/plugin-scaffolder-backend@1.7.0-next.2 - - @backstage/plugin-app-backend@0.3.37-next.2 - - @backstage/backend-defaults@0.1.2-next.2 - -## 0.0.4-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.7.0-next.1 - - @backstage/backend-defaults@0.1.2-next.1 - - @backstage/plugin-app-backend@0.3.37-next.1 - - @backstage/plugin-catalog-backend@1.4.1-next.1 - -## 0.0.4-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.7.0-next.0 - - @backstage/backend-defaults@0.1.2-next.0 - - @backstage/plugin-catalog-backend@1.4.1-next.0 - - @backstage/plugin-app-backend@0.3.37-next.0 - -## 0.0.3 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.6.0 - - @backstage/plugin-catalog-backend@1.4.0 - - @backstage/backend-defaults@0.1.1 - -## 0.0.3-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.4.0-next.1 - - @backstage/plugin-scaffolder-backend@1.6.0-next.1 - -## 0.0.3-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.6.0-next.0 - - @backstage/plugin-catalog-backend@1.3.2-next.0 - - @backstage/backend-defaults@0.1.1-next.0 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.5.0 - - @backstage/backend-defaults@0.1.0 - - @backstage/plugin-catalog-backend@1.3.1 - -## 0.0.2-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.5.0-next.0 - - @backstage/backend-app-api@0.1.1-next.0 - - @backstage/plugin-catalog-backend@1.3.1-next.0 - -## 0.0.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.3.0 - - @backstage/plugin-scaffolder-backend@1.4.0 - - @backstage/backend-app-api@0.1.0 - -## 0.0.1-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.3.0-next.3 - - @backstage/plugin-scaffolder-backend@1.4.0-next.3 - - @backstage/backend-app-api@0.1.0-next.0 diff --git a/packages/backend-next/README.md b/packages/backend-next/README.md deleted file mode 100644 index 4634e5673f..0000000000 --- a/packages/backend-next/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# example-backend-next - -This is an example backend for [the new Backstage backend system](https://backstage.io/docs/backend-system/). - -Do not use this in your own projects. diff --git a/packages/backend-next/knip-report.md b/packages/backend-next/knip-report.md deleted file mode 100644 index a26b412ee9..0000000000 --- a/packages/backend-next/knip-report.md +++ /dev/null @@ -1,12 +0,0 @@ -# Knip report - -## Unused dependencies (5) - -| Name | Location | Severity | -| :----------------------------------------------- | :----------- | :------- | -| @backstage/plugin-catalog-backend-module-openapi | package.json | error | -| @backstage/plugin-search-backend-node | package.json | error | -| @backstage/plugin-permission-common | package.json | error | -| @backstage/plugin-permission-node | package.json | error | -| @backstage/backend-tasks | package.json | error | - diff --git a/packages/backend-next/src/index.ts b/packages/backend-next/src/index.ts deleted file mode 100644 index a4acd19cf2..0000000000 --- a/packages/backend-next/src/index.ts +++ /dev/null @@ -1,51 +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 { createBackend } from '@backstage/backend-defaults'; - -const backend = createBackend(); - -backend.add(import('@backstage/plugin-auth-backend')); -backend.add(import('./authModuleGithubProvider')); -backend.add(import('@backstage/plugin-auth-backend-module-guest-provider')); - -backend.add(import('@backstage/plugin-app-backend/alpha')); -backend.add(import('@backstage/plugin-catalog-backend-module-unprocessed')); -backend.add( - import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model'), -); -backend.add(import('@backstage/plugin-catalog-backend/alpha')); -backend.add(import('@backstage/plugin-devtools-backend')); -backend.add(import('@backstage/plugin-kubernetes-backend/alpha')); -backend.add( - import('@backstage/plugin-permission-backend-module-allow-all-policy'), -); -backend.add(import('@backstage/plugin-permission-backend/alpha')); -backend.add(import('@backstage/plugin-proxy-backend/alpha')); -backend.add(import('@backstage/plugin-scaffolder-backend/alpha')); -backend.add(import('@backstage/plugin-scaffolder-backend-module-github')); -backend.add(import('@backstage/plugin-search-backend-module-catalog/alpha')); -backend.add(import('@backstage/plugin-search-backend-module-explore/alpha')); -backend.add(import('@backstage/plugin-search-backend-module-techdocs/alpha')); -backend.add( - import('@backstage/plugin-catalog-backend-module-backstage-openapi'), -); -backend.add(import('@backstage/plugin-search-backend/alpha')); -backend.add(import('@backstage/plugin-techdocs-backend/alpha')); -backend.add(import('@backstage/plugin-signals-backend')); -backend.add(import('@backstage/plugin-notifications-backend')); - -backend.start(); diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 06aba6c5ca..29e3aecc7c 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,119 +1,107 @@ # example-backend -## 0.2.98-next.1 +## 0.0.26-next.1 ### Patch Changes - Updated dependencies - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.1 - - @backstage/backend-common@0.22.0-next.1 + - @backstage/plugin-notifications-backend@0.2.1-next.1 - @backstage/plugin-catalog-backend@1.22.0-next.1 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.1 - @backstage/plugin-scaffolder-backend@1.22.5-next.1 - - example-app@0.2.97-next.1 - @backstage/plugin-search-backend@1.5.8-next.1 + - @backstage/backend-defaults@0.2.18-next.1 - @backstage/plugin-app-backend@0.3.66-next.1 - @backstage/plugin-kubernetes-backend@0.17.1-next.1 - @backstage/backend-tasks@0.5.23-next.1 - @backstage/plugin-auth-backend@0.22.5-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.4-next.1 - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.36-next.1 - @backstage/plugin-devtools-backend@0.3.4-next.1 - - @backstage/plugin-events-backend@0.3.5-next.1 - - @backstage/plugin-events-node@0.3.4-next.1 - @backstage/plugin-permission-backend@0.5.42-next.1 - @backstage/plugin-permission-node@0.7.29-next.1 - @backstage/plugin-proxy-backend@0.4.16-next.1 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.19-next.1 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.4-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.35-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.2.8-next.1 - @backstage/plugin-search-backend-module-catalog@0.1.24-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.4.1-next.1 - @backstage/plugin-search-backend-module-explore@0.1.24-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.27-next.1 - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.1 - @backstage/plugin-search-backend-node@1.2.22-next.1 - @backstage/plugin-signals-backend@0.1.4-next.1 - - @backstage/plugin-signals-node@0.1.4-next.1 - @backstage/plugin-techdocs-backend@1.10.5-next.1 - - @backstage/plugin-catalog-node@1.11.2-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.1.15-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.15-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.1-next.1 -## 0.2.98-next.0 +## 0.0.26-next.0 ### Patch Changes - Updated dependencies + - @backstage/plugin-scaffolder-backend-module-github@0.2.8-next.0 - @backstage/plugin-catalog-backend@1.22.0-next.0 - @backstage/plugin-scaffolder-backend@1.22.5-next.0 - @backstage/catalog-model@1.5.0-next.0 - @backstage/plugin-search-backend-node@1.2.22-next.0 - @backstage/plugin-search-backend@1.5.8-next.0 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.4-next.0 - @backstage/plugin-search-backend-module-catalog@0.1.23-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.1-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.4-next.0 - @backstage/plugin-search-backend-module-explore@0.1.23-next.0 - @backstage/plugin-auth-backend@0.22.5-next.0 - @backstage/plugin-auth-node@0.4.13-next.0 - - @backstage/backend-common@0.21.8-next.0 - - example-app@0.2.97-next.0 + - @backstage/plugin-notifications-backend@0.2.1-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.36-next.0 + - @backstage/backend-defaults@0.2.18-next.0 - @backstage/plugin-app-backend@0.3.66-next.0 - @backstage/plugin-kubernetes-backend@0.17.1-next.0 - - @backstage/catalog-client@1.6.5-next.0 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.0 - - @backstage/plugin-catalog-node@1.11.2-next.0 - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.0 - @backstage/plugin-techdocs-backend@1.10.5-next.0 - @backstage/backend-tasks@0.5.23-next.0 - - @backstage/config@1.2.0 - - @backstage/integration@1.10.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.15-next.0 - @backstage/plugin-devtools-backend@0.3.4-next.0 - - @backstage/plugin-events-backend@0.3.5-next.0 - - @backstage/plugin-events-node@0.3.4-next.0 - @backstage/plugin-permission-backend@0.5.42-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.15-next.0 - @backstage/plugin-permission-common@0.7.13 - @backstage/plugin-permission-node@0.7.29-next.0 - @backstage/plugin-proxy-backend@0.4.16-next.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.19-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.35-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.4.1-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.27-next.0 - @backstage/plugin-signals-backend@0.1.4-next.0 - - @backstage/plugin-signals-node@0.1.4-next.0 -## 0.2.97 +## 0.0.25 ### Patch Changes - Updated dependencies - - @backstage/plugin-search-backend-module-pg@0.5.26 - @backstage/plugin-badges-backend@0.4.0 - @backstage/plugin-kubernetes-backend@0.17.0 - - @backstage/backend-common@0.21.7 - @backstage/plugin-azure-devops-backend@0.6.4 - @backstage/plugin-techdocs-backend@1.10.4 + - @backstage/plugin-notifications-backend@0.2.0 - @backstage/plugin-permission-node@0.7.28 - @backstage/plugin-auth-backend@0.22.4 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.3 - @backstage/plugin-catalog-backend@1.21.1 - - @backstage/plugin-events-backend@0.3.4 - - @backstage/plugin-tech-insights-node@0.6.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.0 + - @backstage/backend-plugin-api@0.6.17 - @backstage/plugin-search-backend@1.5.7 - @backstage/plugin-todo-backend@0.3.16 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.49 + - @backstage/plugin-scaffolder-backend-module-github@0.2.7 - @backstage/plugin-search-backend-module-techdocs@0.1.22 - @backstage/plugin-search-backend-module-explore@0.1.21 - @backstage/plugin-entity-feedback-backend@0.2.14 - - @backstage/plugin-code-coverage-backend@0.2.31 - - @backstage/plugin-tech-insights-backend@0.5.31 - @backstage/plugin-search-backend-node@1.2.21 - @backstage/plugin-lighthouse-backend@0.4.10 - @backstage/plugin-permission-backend@0.5.41 + - @backstage/plugin-sonarqube-backend@0.2.19 - @backstage/plugin-devtools-backend@0.3.3 - @backstage/plugin-linguist-backend@0.5.15 - @backstage/plugin-playlist-backend@0.3.21 - - @backstage/plugin-explore-backend@0.0.27 - @backstage/plugin-jenkins-backend@0.4.4 - @backstage/backend-tasks@0.5.22 - - @backstage/plugin-kafka-backend@0.3.15 - @backstage/plugin-nomad-backend@0.1.19 - @backstage/plugin-adr-backend@0.4.14 - @backstage/plugin-app-backend@0.3.65 @@ -121,218 +109,174 @@ - @backstage/plugin-signals-backend@0.1.3 - @backstage/plugin-proxy-backend@0.4.15 - @backstage/plugin-scaffolder-backend@1.22.4 - - @backstage/catalog-client@1.6.4 - - @backstage/integration@1.10.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.4.0 - - example-app@0.2.96 + - @backstage/backend-defaults@0.2.17 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.3 + - @backstage/plugin-catalog-backend-module-openapi@0.1.35 - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4 - - @backstage/plugin-events-node@0.3.3 - - @backstage/plugin-rollbar-backend@0.1.62 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.18 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.34 - @backstage/plugin-search-backend-module-catalog@0.1.22 - - @backstage/plugin-signals-node@0.1.3 - - @backstage/plugin-catalog-node@1.11.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.14 - @backstage/catalog-model@1.4.5 - - @backstage/config@1.2.0 - - @backstage/plugin-azure-sites-common@0.1.3 + - @backstage/plugin-auth-backend-module-github-provider@0.1.14 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15 - @backstage/plugin-permission-common@0.7.13 -## 0.2.97-next.1 +## 0.0.25-next.1 ### Patch Changes - Updated dependencies - @backstage/plugin-kubernetes-backend@0.17.0-next.1 - - @backstage/backend-common@0.21.7-next.1 - @backstage/plugin-azure-devops-backend@0.6.4-next.1 - @backstage/plugin-techdocs-backend@1.10.4-next.1 - - @backstage/plugin-events-backend@0.3.4-next.1 - @backstage/plugin-auth-backend@0.22.4-next.1 + - @backstage/backend-plugin-api@0.6.17-next.1 - @backstage/plugin-auth-node@0.4.12-next.1 - @backstage/plugin-proxy-backend@0.4.15-next.1 - @backstage/plugin-scaffolder-backend@1.22.4-next.1 - @backstage/plugin-catalog-backend@1.21.1-next.1 - - @backstage/catalog-client@1.6.4-next.0 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.3-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.2.7-next.1 - @backstage/plugin-app-backend@0.3.65-next.1 + - @backstage/plugin-notifications-backend@0.2.0-next.1 + - @backstage/backend-defaults@0.2.17-next.1 - @backstage/backend-tasks@0.5.22-next.1 - @backstage/plugin-adr-backend@0.4.14-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.3-next.1 - @backstage/plugin-badges-backend@0.3.14-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.35-next.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4-next.1 - - @backstage/plugin-code-coverage-backend@0.2.31-next.1 - @backstage/plugin-devtools-backend@0.3.3-next.1 - @backstage/plugin-entity-feedback-backend@0.2.14-next.1 - - @backstage/plugin-events-node@0.3.3-next.1 - - @backstage/plugin-explore-backend@0.0.27-next.1 - @backstage/plugin-jenkins-backend@0.4.4-next.1 - - @backstage/plugin-kafka-backend@0.3.15-next.1 - @backstage/plugin-lighthouse-backend@0.4.10-next.1 - @backstage/plugin-linguist-backend@0.5.15-next.1 - @backstage/plugin-nomad-backend@0.1.19-next.1 - @backstage/plugin-permission-backend@0.5.41-next.1 - @backstage/plugin-permission-node@0.7.28-next.1 - @backstage/plugin-playlist-backend@0.3.21-next.1 - - @backstage/plugin-rollbar-backend@0.1.62-next.1 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.18-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.34-next.1 - @backstage/plugin-search-backend@1.5.7-next.1 - @backstage/plugin-search-backend-module-catalog@0.1.22-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.20-next.1 - @backstage/plugin-search-backend-module-explore@0.1.21-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.26-next.1 - @backstage/plugin-search-backend-module-techdocs@0.1.22-next.1 - @backstage/plugin-search-backend-node@1.2.21-next.1 - @backstage/plugin-signals-backend@0.1.3-next.1 - - @backstage/plugin-signals-node@0.1.3-next.1 - - @backstage/plugin-tech-insights-backend@0.5.31-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.49-next.1 - - @backstage/plugin-tech-insights-node@0.5.3-next.1 + - @backstage/plugin-sonarqube-backend@0.2.19-next.1 - @backstage/plugin-todo-backend@0.3.16-next.1 - - example-app@0.2.96-next.1 - @backstage/catalog-model@1.4.5 - - @backstage/config@1.2.0 - - @backstage/integration@1.10.0-next.0 - - @backstage/plugin-azure-sites-common@0.1.3 + - @backstage/plugin-auth-backend-module-github-provider@0.1.14-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.11-next.1 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15-next.1 - - @backstage/plugin-catalog-node@1.11.1-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.14-next.1 - @backstage/plugin-permission-common@0.7.13 -## 0.2.97-next.0 +## 0.0.25-next.0 ### Patch Changes - Updated dependencies - @backstage/plugin-techdocs-backend@1.10.4-next.0 - @backstage/plugin-catalog-backend@1.21.1-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.11-next.0 - @backstage/plugin-kubernetes-backend@0.16.4-next.0 - @backstage/plugin-signals-backend@0.1.3-next.0 - - @backstage/backend-common@0.21.7-next.0 - - @backstage/integration@1.10.0-next.0 - @backstage/plugin-search-backend-module-techdocs@0.1.22-next.0 - @backstage/plugin-scaffolder-backend@1.22.4-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.35-next.0 + - @backstage/backend-defaults@0.2.17-next.0 - @backstage/plugin-app-backend@0.3.65-next.0 - - example-app@0.2.96-next.0 + - @backstage/backend-plugin-api@0.6.17-next.0 - @backstage/backend-tasks@0.5.22-next.0 - - @backstage/catalog-client@1.6.3 - @backstage/catalog-model@1.4.5 - - @backstage/config@1.2.0 - @backstage/plugin-adr-backend@0.4.14-next.0 - @backstage/plugin-auth-backend@0.22.4-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.14-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.3-next.0 - @backstage/plugin-auth-node@0.4.12-next.0 - @backstage/plugin-azure-devops-backend@0.6.4-next.0 - - @backstage/plugin-azure-sites-common@0.1.3 - @backstage/plugin-badges-backend@0.3.14-next.0 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.15-next.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.4.4-next.0 - - @backstage/plugin-catalog-node@1.11.1-next.0 - - @backstage/plugin-code-coverage-backend@0.2.31-next.0 - @backstage/plugin-devtools-backend@0.3.3-next.0 - @backstage/plugin-entity-feedback-backend@0.2.14-next.0 - - @backstage/plugin-events-backend@0.3.3-next.0 - - @backstage/plugin-events-node@0.3.3-next.0 - - @backstage/plugin-explore-backend@0.0.27-next.0 - @backstage/plugin-jenkins-backend@0.4.4-next.0 - - @backstage/plugin-kafka-backend@0.3.15-next.0 - @backstage/plugin-lighthouse-backend@0.4.10-next.0 - @backstage/plugin-linguist-backend@0.5.15-next.0 - @backstage/plugin-nomad-backend@0.1.19-next.0 + - @backstage/plugin-notifications-backend@0.1.3-next.0 - @backstage/plugin-permission-backend@0.5.41-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.14-next.0 - @backstage/plugin-permission-common@0.7.13 - @backstage/plugin-permission-node@0.7.28-next.0 - @backstage/plugin-playlist-backend@0.3.21-next.0 - @backstage/plugin-proxy-backend@0.4.15-next.0 - - @backstage/plugin-rollbar-backend@0.1.62-next.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.18-next.0 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.3-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.34-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.2.7-next.0 - @backstage/plugin-search-backend@1.5.7-next.0 - @backstage/plugin-search-backend-module-catalog@0.1.22-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.20-next.0 - @backstage/plugin-search-backend-module-explore@0.1.21-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.26-next.0 - @backstage/plugin-search-backend-node@1.2.21-next.0 - - @backstage/plugin-signals-node@0.1.3-next.0 - - @backstage/plugin-tech-insights-backend@0.5.31-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.49-next.0 - - @backstage/plugin-tech-insights-node@0.5.3-next.0 + - @backstage/plugin-sonarqube-backend@0.2.19-next.0 - @backstage/plugin-todo-backend@0.3.16-next.0 -## 0.2.96 +## 0.0.24 ### Patch Changes - Updated dependencies - @backstage/plugin-catalog-backend@1.21.0 - - @backstage/plugin-catalog-node@1.11.0 - @backstage/plugin-kubernetes-backend@0.16.3 - @backstage/plugin-catalog-backend-module-unprocessed@0.4.3 - @backstage/plugin-permission-backend@0.5.40 - @backstage/plugin-proxy-backend@0.4.14 - @backstage/plugin-scaffolder-backend@1.22.3 - - @backstage/catalog-client@1.6.3 - @backstage/plugin-jenkins-backend@0.4.3 - @backstage/plugin-auth-backend@0.22.3 - @backstage/plugin-auth-node@0.4.11 - - @backstage/backend-common@0.21.6 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.34 - @backstage/plugin-azure-devops-backend@0.6.3 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.10 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.14 - @backstage/plugin-lighthouse-backend@0.4.9 - @backstage/plugin-linguist-backend@0.5.14 - @backstage/plugin-search-backend-module-catalog@0.1.21 - @backstage/plugin-search-backend-module-techdocs@0.1.21 - @backstage/plugin-todo-backend@0.3.15 - - example-app@0.2.95 + - @backstage/backend-defaults@0.2.16 - @backstage/plugin-app-backend@0.3.64 - @backstage/plugin-adr-backend@0.4.13 - @backstage/plugin-badges-backend@0.3.13 - - @backstage/plugin-code-coverage-backend@0.2.30 - @backstage/plugin-entity-feedback-backend@0.2.13 + - @backstage/plugin-notifications-backend@0.1.2 - @backstage/plugin-playlist-backend@0.3.20 - - @backstage/plugin-tech-insights-backend@0.5.30 - @backstage/plugin-techdocs-backend@1.10.3 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.2 + - @backstage/plugin-auth-backend-module-github-provider@0.1.13 + - @backstage/backend-plugin-api@0.6.16 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.13 - @backstage/plugin-permission-node@0.7.27 - @backstage/plugin-signals-backend@0.1.2 - - @backstage/plugin-signals-node@0.1.2 - @backstage/backend-tasks@0.5.21 - @backstage/plugin-devtools-backend@0.3.2 - - @backstage/plugin-events-backend@0.3.2 - - @backstage/plugin-events-node@0.3.2 - - @backstage/plugin-explore-backend@0.0.26 - - @backstage/plugin-kafka-backend@0.3.14 - @backstage/plugin-nomad-backend@0.1.18 - - @backstage/plugin-rollbar-backend@0.1.61 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.17 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.33 + - @backstage/plugin-scaffolder-backend-module-github@0.2.6 - @backstage/plugin-search-backend@1.5.6 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.19 - @backstage/plugin-search-backend-module-explore@0.1.20 - - @backstage/plugin-search-backend-module-pg@0.5.25 - @backstage/plugin-search-backend-node@1.2.20 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.48 - - @backstage/plugin-tech-insights-node@0.5.2 + - @backstage/plugin-sonarqube-backend@0.2.18 - @backstage/catalog-model@1.4.5 - - @backstage/config@1.2.0 - - @backstage/integration@1.9.1 - - @backstage/plugin-azure-sites-common@0.1.3 - @backstage/plugin-permission-common@0.7.13 -## 0.2.95 +## 0.0.23 ### Patch Changes - Updated dependencies - @backstage/plugin-catalog-backend@1.20.0 - - @backstage/plugin-catalog-node@1.10.0 - @backstage/plugin-kubernetes-backend@0.16.2 - @backstage/plugin-catalog-backend-module-unprocessed@0.4.2 - @backstage/plugin-permission-backend@0.5.39 - - @backstage/catalog-client@1.6.2 - - @backstage/backend-common@0.21.5 + - @backstage/plugin-catalog-backend-module-openapi@0.1.33 - @backstage/plugin-auth-backend@0.22.2 - @backstage/plugin-azure-devops-backend@0.6.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.9 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.13 - @backstage/plugin-jenkins-backend@0.4.2 - @backstage/plugin-lighthouse-backend@0.4.8 @@ -341,55 +285,45 @@ - @backstage/plugin-search-backend-module-catalog@0.1.20 - @backstage/plugin-search-backend-module-techdocs@0.1.20 - @backstage/plugin-todo-backend@0.3.14 - - example-app@0.2.94 + - @backstage/backend-defaults@0.2.15 - @backstage/plugin-app-backend@0.3.63 - @backstage/plugin-adr-backend@0.4.12 - @backstage/plugin-auth-node@0.4.10 - @backstage/plugin-badges-backend@0.3.12 - - @backstage/plugin-code-coverage-backend@0.2.29 - @backstage/plugin-entity-feedback-backend@0.2.12 + - @backstage/plugin-notifications-backend@0.1.1 - @backstage/plugin-playlist-backend@0.3.19 - - @backstage/plugin-tech-insights-backend@0.5.29 - @backstage/plugin-techdocs-backend@1.10.2 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.1 - @backstage/backend-tasks@0.5.20 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.1 - @backstage/plugin-devtools-backend@0.3.1 - - @backstage/plugin-events-backend@0.3.1 - - @backstage/plugin-events-node@0.3.1 - - @backstage/plugin-explore-backend@0.0.25 - - @backstage/plugin-kafka-backend@0.3.13 - @backstage/plugin-nomad-backend@0.1.17 - @backstage/plugin-permission-node@0.7.26 - @backstage/plugin-proxy-backend@0.4.13 - - @backstage/plugin-rollbar-backend@0.1.60 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.16 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.32 + - @backstage/plugin-scaffolder-backend-module-github@0.2.5 - @backstage/plugin-search-backend@1.5.5 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.18 - @backstage/plugin-search-backend-module-explore@0.1.19 - - @backstage/plugin-search-backend-module-pg@0.5.24 - @backstage/plugin-search-backend-node@1.2.19 - @backstage/plugin-signals-backend@0.1.1 - - @backstage/plugin-signals-node@0.1.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.47 - - @backstage/plugin-tech-insights-node@0.5.1 + - @backstage/plugin-sonarqube-backend@0.2.17 + - @backstage/backend-plugin-api@0.6.15 - @backstage/catalog-model@1.4.5 - - @backstage/config@1.2.0 - - @backstage/integration@1.9.1 - - @backstage/plugin-azure-sites-common@0.1.3 + - @backstage/plugin-auth-backend-module-github-provider@0.1.12 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.12 - @backstage/plugin-permission-common@0.7.13 -## 0.2.94 +## 0.0.22 ### Patch Changes - Updated dependencies - @backstage/plugin-catalog-backend@1.19.0 - - @backstage/plugin-catalog-node@1.9.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.4.1 - @backstage/plugin-permission-backend@0.5.38 + - @backstage/plugin-catalog-backend-module-openapi@0.1.32 - @backstage/plugin-auth-backend@0.22.1 - @backstage/plugin-azure-devops-backend@0.6.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.8 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.12 - @backstage/plugin-jenkins-backend@0.4.1 - @backstage/plugin-kubernetes-backend@0.16.1 @@ -399,157 +333,130 @@ - @backstage/plugin-search-backend-module-catalog@0.1.19 - @backstage/plugin-search-backend-module-techdocs@0.1.19 - @backstage/plugin-todo-backend@0.3.13 + - @backstage/plugin-auth-backend-module-github-provider@0.1.11 - @backstage/plugin-techdocs-backend@1.10.1 -## 0.2.93 +## 0.0.21 ### Patch Changes - Updated dependencies - - @backstage/plugin-events-backend@0.3.0 - - @backstage/plugin-events-node@0.3.0 + - @backstage/plugin-notifications-backend@0.1.0 - @backstage/plugin-scaffolder-backend@1.22.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.31 - @backstage/plugin-linguist-backend@0.5.11 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.7 - @backstage/plugin-catalog-backend-module-unprocessed@0.4.0 - @backstage/plugin-catalog-backend@1.18.0 - - @backstage/plugin-code-coverage-backend@0.2.28 - @backstage/plugin-devtools-backend@0.3.0 - @backstage/plugin-jenkins-backend@0.4.0 - @backstage/plugin-search-backend@1.5.4 - - @backstage/backend-common@0.21.4 - - @backstage/integration@1.9.1 - @backstage/plugin-auth-node@0.4.9 - @backstage/plugin-lighthouse-backend@0.4.6 - - @backstage/config@1.2.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.0 - @backstage/plugin-azure-devops-backend@0.6.0 - @backstage/plugin-permission-backend@0.5.37 - @backstage/plugin-signals-backend@0.1.0 - @backstage/plugin-nomad-backend@0.1.16 - @backstage/plugin-entity-feedback-backend@0.2.11 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.17 - - @backstage/plugin-search-backend-module-pg@0.5.23 - - @backstage/plugin-signals-node@0.1.0 - @backstage/plugin-playlist-backend@0.3.18 + - @backstage/backend-plugin-api@0.6.14 - @backstage/plugin-auth-backend@0.22.0 - @backstage/plugin-techdocs-backend@1.10.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.15 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.0 + - @backstage/plugin-scaffolder-backend-module-github@0.2.4 - @backstage/plugin-permission-common@0.7.13 - @backstage/plugin-search-backend-module-techdocs@0.1.18 - @backstage/plugin-search-backend-module-catalog@0.1.18 - @backstage/plugin-search-backend-module-explore@0.1.18 - - @backstage/plugin-catalog-node@1.8.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.46 - - @backstage/catalog-client@1.6.1 + - @backstage/backend-defaults@0.2.14 - @backstage/plugin-kubernetes-backend@0.16.0 - @backstage/plugin-adr-backend@0.4.11 - @backstage/plugin-proxy-backend@0.4.12 - @backstage/backend-tasks@0.5.19 - @backstage/plugin-search-backend-node@1.2.18 - - @backstage/plugin-tech-insights-backend@0.5.28 - @backstage/plugin-app-backend@0.3.62 - @backstage/plugin-permission-node@0.7.25 - @backstage/plugin-todo-backend@0.3.12 - - @backstage/plugin-tech-insights-node@0.5.0 - @backstage/plugin-badges-backend@0.3.11 - - example-app@0.2.93 + - @backstage/plugin-auth-backend-module-github-provider@0.1.11 + - @backstage/plugin-catalog-backend-module-openapi@0.1.31 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11 - - @backstage/plugin-explore-backend@0.0.24 - - @backstage/plugin-rollbar-backend@0.1.59 - - @backstage/plugin-kafka-backend@0.3.12 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.11 + - @backstage/plugin-sonarqube-backend@0.2.16 - @backstage/catalog-model@1.4.5 - - @backstage/plugin-azure-sites-common@0.1.3 -## 0.2.93-next.2 +## 0.0.21-next.2 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.22.0-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.31-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.7-next.2 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.11-next.2 - @backstage/plugin-catalog-backend@1.18.0-next.2 - - @backstage/plugin-code-coverage-backend@0.2.28-next.2 - @backstage/plugin-devtools-backend@0.3.0-next.2 - @backstage/plugin-jenkins-backend@0.4.0-next.2 - @backstage/plugin-search-backend@1.5.4-next.2 - - @backstage/integration@1.9.1-next.2 - @backstage/plugin-techdocs-backend@1.10.0-next.2 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.3.0-next.2 - - @backstage/plugin-signals-node@0.1.0-next.2 - - @backstage/catalog-client@1.6.1-next.1 + - @backstage/plugin-notifications-backend@0.1.0-next.2 - @backstage/plugin-linguist-backend@0.5.11-next.2 - @backstage/plugin-kubernetes-backend@0.16.0-next.2 - @backstage/plugin-todo-backend@0.3.12-next.2 - @backstage/plugin-signals-backend@0.1.0-next.2 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.15-next.2 - - @backstage/backend-common@0.21.4-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.2.4-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.31-next.2 - @backstage/plugin-adr-backend@0.4.11-next.2 - @backstage/plugin-azure-devops-backend@0.6.0-next.2 - - example-app@0.2.93-next.2 - @backstage/plugin-search-backend-module-techdocs@0.1.18-next.2 - @backstage/plugin-auth-backend@0.22.0-next.2 + - @backstage/backend-defaults@0.2.14-next.2 - @backstage/plugin-app-backend@0.3.62-next.2 - @backstage/plugin-auth-node@0.4.9-next.2 - @backstage/plugin-badges-backend@0.3.11-next.2 - - @backstage/plugin-catalog-node@1.8.0-next.2 - @backstage/plugin-entity-feedback-backend@0.2.11-next.2 - @backstage/plugin-lighthouse-backend@0.4.6-next.2 - @backstage/plugin-playlist-backend@0.3.18-next.2 - @backstage/plugin-search-backend-module-catalog@0.1.18-next.2 - - @backstage/plugin-tech-insights-backend@0.5.28-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 - @backstage/backend-tasks@0.5.19-next.2 - @backstage/catalog-model@1.4.5-next.0 - - @backstage/config@1.2.0-next.1 - - @backstage/plugin-azure-sites-common@0.1.3-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.1.11-next.2 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.0-next.2 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11-next.2 - - @backstage/plugin-events-backend@0.3.0-next.2 - - @backstage/plugin-events-node@0.3.0-next.2 - - @backstage/plugin-explore-backend@0.0.24-next.2 - - @backstage/plugin-kafka-backend@0.3.12-next.2 - @backstage/plugin-nomad-backend@0.1.16-next.2 - @backstage/plugin-permission-backend@0.5.37-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.11-next.2 - @backstage/plugin-permission-common@0.7.13-next.1 - @backstage/plugin-permission-node@0.7.25-next.2 - @backstage/plugin-proxy-backend@0.4.12-next.2 - - @backstage/plugin-rollbar-backend@0.1.59-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.17-next.2 - @backstage/plugin-search-backend-module-explore@0.1.18-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.23-next.2 - @backstage/plugin-search-backend-node@1.2.18-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.46-next.2 - - @backstage/plugin-tech-insights-node@0.5.0-next.2 + - @backstage/plugin-sonarqube-backend@0.2.16-next.2 -## 0.2.93-next.1 +## 0.0.21-next.1 ### Patch Changes - Updated dependencies - - @backstage/config@1.2.0-next.1 - @backstage/plugin-entity-feedback-backend@0.2.11-next.1 + - @backstage/plugin-notifications-backend@0.1.0-next.1 - @backstage/plugin-scaffolder-backend@1.22.0-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.17-next.1 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.0-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.2.4-next.1 - @backstage/plugin-app-backend@0.3.62-next.1 - @backstage/plugin-signals-backend@0.1.0-next.1 - - @backstage/plugin-signals-node@0.1.0-next.1 - @backstage/plugin-azure-devops-backend@0.6.0-next.1 - @backstage/plugin-kubernetes-backend@0.16.0-next.1 - - example-app@0.2.93-next.1 - - @backstage/backend-common@0.21.4-next.1 + - @backstage/backend-plugin-api@0.6.14-next.1 - @backstage/backend-tasks@0.5.19-next.1 - - @backstage/integration@1.9.1-next.1 - @backstage/plugin-adr-backend@0.4.11-next.1 - @backstage/plugin-auth-backend@0.22.0-next.1 - @backstage/plugin-auth-node@0.4.9-next.1 - @backstage/plugin-badges-backend@0.3.11-next.1 - @backstage/plugin-catalog-backend@1.18.0-next.1 - - @backstage/plugin-code-coverage-backend@0.2.28-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.7-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.31-next.1 - @backstage/plugin-devtools-backend@0.3.0-next.1 - - @backstage/plugin-events-backend@0.3.0-next.1 - - @backstage/plugin-explore-backend@0.0.24-next.1 - @backstage/plugin-jenkins-backend@0.4.0-next.1 - - @backstage/plugin-kafka-backend@0.3.12-next.1 - @backstage/plugin-lighthouse-backend@0.4.6-next.1 - @backstage/plugin-linguist-backend@0.5.11-next.1 - @backstage/plugin-nomad-backend@0.1.16-next.1 @@ -558,103 +465,78 @@ - @backstage/plugin-permission-node@0.7.25-next.1 - @backstage/plugin-playlist-backend@0.3.18-next.1 - @backstage/plugin-proxy-backend@0.4.12-next.1 - - @backstage/plugin-rollbar-backend@0.1.59-next.1 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.15-next.1 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.2.17-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.31-next.1 - @backstage/plugin-search-backend@1.5.4-next.1 - @backstage/plugin-search-backend-module-catalog@0.1.18-next.1 - @backstage/plugin-search-backend-module-explore@0.1.18-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.23-next.1 - @backstage/plugin-search-backend-module-techdocs@0.1.18-next.1 - @backstage/plugin-search-backend-node@1.2.18-next.1 - - @backstage/plugin-tech-insights-backend@0.5.28-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.46-next.1 - - @backstage/plugin-tech-insights-node@0.5.0-next.1 + - @backstage/plugin-sonarqube-backend@0.2.16-next.1 - @backstage/plugin-techdocs-backend@1.9.7-next.1 - @backstage/plugin-todo-backend@0.3.12-next.1 - - @backstage/catalog-client@1.6.1-next.0 + - @backstage/backend-defaults@0.2.14-next.1 - @backstage/catalog-model@1.4.5-next.0 - - @backstage/plugin-azure-sites-common@0.1.3-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.1.11-next.1 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.11-next.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.11-next.1 - - @backstage/plugin-catalog-node@1.8.0-next.1 - - @backstage/plugin-events-node@0.3.0-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.11-next.1 -## 0.2.93-next.0 +## 0.0.21-next.0 ### Patch Changes - Updated dependencies - - @backstage/plugin-events-backend@0.3.0-next.0 - - @backstage/plugin-events-node@0.3.0-next.0 - @backstage/plugin-linguist-backend@0.5.10-next.0 - - @backstage/backend-common@0.21.3-next.0 - @backstage/plugin-auth-node@0.4.8-next.0 - @backstage/plugin-lighthouse-backend@0.4.5-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.16-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.22-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.1.0-next.0 - @backstage/plugin-playlist-backend@0.3.17-next.0 - - @backstage/plugin-code-coverage-backend@0.2.27-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 - @backstage/plugin-entity-feedback-backend@0.2.10-next.0 + - @backstage/plugin-notifications-backend@0.1.0-next.0 - @backstage/plugin-catalog-backend@1.18.0-next.0 - @backstage/plugin-auth-backend@0.22.0-next.0 - @backstage/plugin-jenkins-backend@0.4.0-next.0 - @backstage/plugin-azure-devops-backend@0.6.0-next.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.14-next.0 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.2.16-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.30-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.2.3-next.0 - @backstage/plugin-scaffolder-backend@1.22.0-next.0 - @backstage/plugin-permission-common@0.7.13-next.0 - @backstage/plugin-search-backend-module-techdocs@0.1.17-next.0 - @backstage/plugin-search-backend-module-catalog@0.1.17-next.0 - @backstage/plugin-search-backend-module-explore@0.1.17-next.0 - - @backstage/plugin-catalog-node@1.8.0-next.0 + - @backstage/backend-defaults@0.2.13-next.0 - @backstage/plugin-kubernetes-backend@0.16.0-next.0 - @backstage/plugin-adr-backend@0.4.10-next.0 - @backstage/plugin-proxy-backend@0.4.11-next.0 - @backstage/backend-tasks@0.5.18-next.0 - @backstage/plugin-search-backend-node@1.2.17-next.0 - @backstage/plugin-signals-backend@0.0.4-next.0 - - @backstage/plugin-signals-node@0.0.4-next.0 - - @backstage/plugin-tech-insights-backend@0.5.27-next.0 - @backstage/plugin-search-backend@1.5.3-next.0 - @backstage/plugin-devtools-backend@0.3.0-next.0 - @backstage/plugin-permission-node@0.7.24-next.0 - - @backstage/plugin-tech-insights-node@0.5.0-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.6-next.0 - @backstage/plugin-badges-backend@0.3.10-next.0 - @backstage/plugin-permission-backend@0.5.36-next.0 - @backstage/plugin-app-backend@0.3.61-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.1.10-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.30-next.0 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.10-next.0 - - @backstage/plugin-explore-backend@0.0.23-next.0 - - @backstage/plugin-rollbar-backend@0.1.58-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.45-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.10-next.0 + - @backstage/plugin-sonarqube-backend@0.2.15-next.0 - @backstage/plugin-techdocs-backend@1.9.6-next.0 - - @backstage/plugin-kafka-backend@0.3.11-next.0 - @backstage/plugin-nomad-backend@0.1.15-next.0 - @backstage/plugin-todo-backend@0.3.11-next.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.10-next.0 - - example-app@0.2.93-next.0 - - @backstage/catalog-client@1.6.1-next.0 - @backstage/catalog-model@1.4.5-next.0 - - @backstage/config@1.1.2-next.0 - - @backstage/integration@1.9.1-next.0 - - @backstage/plugin-azure-sites-common@0.1.3-next.0 -## 0.2.92 +## 0.0.20 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.21.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.27 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7 - @backstage/plugin-scaffolder-backend@1.21.0 - @backstage/plugin-badges-backend@0.3.7 - @backstage/plugin-azure-devops-backend@0.5.2 - - @backstage/plugin-explore-backend@0.0.20 - - @backstage/plugin-auth-backend@0.21.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.42 - @backstage/plugin-auth-node@0.4.4 - @backstage/plugin-entity-feedback-backend@0.2.7 - @backstage/plugin-lighthouse-backend@0.4.2 @@ -662,75 +544,56 @@ - @backstage/plugin-linguist-backend@0.5.7 - @backstage/plugin-adr-backend@0.4.7 - @backstage/plugin-kubernetes-backend@0.15.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.11 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.2.13 - @backstage/plugin-signals-backend@0.0.1 - - @backstage/plugin-signals-node@0.0.1 - - @backstage/plugin-tech-insights-backend@0.5.24 - - @backstage/plugin-tech-insights-node@0.4.16 + - @backstage/plugin-notifications-backend@0.0.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.27 - @backstage/plugin-search-backend-module-techdocs@0.1.14 - @backstage/plugin-search-backend-module-catalog@0.1.14 - @backstage/plugin-search-backend-module-explore@0.1.14 - - @backstage/plugin-code-coverage-backend@0.2.24 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/backend-defaults@0.2.10 + - @backstage/plugin-sonarqube-backend@0.2.12 - @backstage/plugin-playlist-backend@0.3.14 - @backstage/plugin-catalog-backend@1.17.0 - @backstage/plugin-jenkins-backend@0.3.4 - - @backstage/plugin-rollbar-backend@0.1.55 - @backstage/backend-tasks@0.5.15 - - @backstage/plugin-events-backend@0.2.19 - @backstage/plugin-nomad-backend@0.1.12 - @backstage/plugin-app-backend@0.3.58 - - @backstage/catalog-model@1.4.4 - - @backstage/integration@1.9.0 - - @backstage/catalog-client@1.6.0 - @backstage/plugin-search-backend@1.5.0 - @backstage/plugin-todo-backend@0.3.8 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3 - @backstage/plugin-techdocs-backend@1.9.3 - - @backstage/plugin-catalog-node@1.7.0 - - @backstage/plugin-azure-sites-common@0.1.2 - - example-app@0.2.92 - - @backstage/plugin-kafka-backend@0.3.8 - @backstage/plugin-permission-backend@0.5.33 - @backstage/plugin-permission-node@0.7.21 - @backstage/plugin-proxy-backend@0.4.8 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.13 - - @backstage/plugin-search-backend-module-pg@0.5.19 - @backstage/plugin-search-backend-node@1.2.14 - - @backstage/config@1.1.1 - - @backstage/plugin-events-node@0.2.19 - @backstage/plugin-permission-common@0.7.12 - - @backstage/plugin-search-common@1.2.10 -## 0.2.92-next.3 +## 0.0.20-next.3 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.21.0-next.3 - @backstage/plugin-badges-backend@0.3.7-next.3 - @backstage/plugin-kubernetes-backend@0.15.0-next.3 - - @backstage/plugin-scaffolder-backend-module-gitlab@0.2.13-next.3 - - @backstage/integration@1.9.0-next.1 - @backstage/backend-tasks@0.5.15-next.3 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.3 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.3 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.3 + - @backstage/plugin-notifications-backend@0.0.1-next.1 - @backstage/plugin-signals-backend@0.0.1-next.3 - - @backstage/plugin-signals-node@0.0.1-next.3 - @backstage/plugin-catalog-backend@1.17.0-next.3 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.11-next.3 - @backstage/plugin-app-backend@0.3.58-next.3 - - @backstage/plugin-auth-backend@0.21.0-next.3 - - @backstage/plugin-catalog-node@1.6.2-next.3 + - @backstage/backend-defaults@0.2.10-next.3 - @backstage/plugin-adr-backend@0.4.7-next.3 - @backstage/plugin-auth-node@0.4.4-next.3 - @backstage/plugin-azure-devops-backend@0.5.2-next.3 - - @backstage/plugin-code-coverage-backend@0.2.24-next.3 + - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.3 - @backstage/plugin-devtools-backend@0.2.7-next.3 - @backstage/plugin-entity-feedback-backend@0.2.7-next.3 - - @backstage/plugin-events-backend@0.2.19-next.3 - - @backstage/plugin-explore-backend@0.0.20-next.3 - @backstage/plugin-jenkins-backend@0.3.4-next.3 - - @backstage/plugin-kafka-backend@0.3.8-next.3 - @backstage/plugin-lighthouse-backend@0.4.2-next.3 - @backstage/plugin-linguist-backend@0.5.7-next.3 - @backstage/plugin-nomad-backend@0.1.12-next.3 @@ -738,243 +601,170 @@ - @backstage/plugin-permission-node@0.7.21-next.3 - @backstage/plugin-playlist-backend@0.3.14-next.3 - @backstage/plugin-proxy-backend@0.4.8-next.3 - - @backstage/plugin-rollbar-backend@0.1.55-next.3 - @backstage/plugin-scaffolder-backend@1.21.0-next.3 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.27-next.3 - @backstage/plugin-search-backend@1.5.0-next.3 - @backstage/plugin-search-backend-module-catalog@0.1.14-next.3 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.13-next.3 - @backstage/plugin-search-backend-module-explore@0.1.14-next.3 - - @backstage/plugin-search-backend-module-pg@0.5.19-next.3 - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.3 - @backstage/plugin-search-backend-node@1.2.14-next.3 - - @backstage/plugin-tech-insights-backend@0.5.24-next.3 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.42-next.3 - - @backstage/plugin-tech-insights-node@0.4.16-next.3 + - @backstage/plugin-sonarqube-backend@0.2.12-next.3 - @backstage/plugin-techdocs-backend@1.9.3-next.3 - @backstage/plugin-todo-backend@0.3.8-next.3 - - example-app@0.2.92-next.3 - - @backstage/catalog-client@1.6.0-next.1 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/config@1.1.1 - - @backstage/plugin-azure-sites-common@0.1.2-next.0 + - @backstage/backend-plugin-api@0.6.10-next.3 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.3 - - @backstage/plugin-events-node@0.2.19-next.3 - @backstage/plugin-permission-common@0.7.12 - - @backstage/plugin-search-common@1.2.10 -## 0.2.92-next.2 +## 0.0.20-next.2 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.21.0-next.2 - - @backstage/plugin-auth-backend@0.21.0-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.42-next.2 - - @backstage/backend-common@0.21.0-next.2 - @backstage/plugin-signals-backend@0.0.1-next.2 - - @backstage/plugin-signals-node@0.0.1-next.2 - @backstage/plugin-kubernetes-backend@0.15.0-next.2 - - @backstage/plugin-tech-insights-backend@0.5.24-next.2 - - @backstage/plugin-tech-insights-node@0.4.16-next.2 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.11-next.2 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.27-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.2 - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.2 - @backstage/plugin-search-backend-module-catalog@0.1.14-next.2 - @backstage/plugin-search-backend-module-explore@0.1.14-next.2 - @backstage/plugin-entity-feedback-backend@0.2.7-next.2 - - @backstage/plugin-code-coverage-backend@0.2.24-next.2 - @backstage/plugin-azure-devops-backend@0.5.2-next.2 + - @backstage/backend-plugin-api@0.6.10-next.2 - @backstage/plugin-lighthouse-backend@0.4.2-next.2 + - @backstage/backend-defaults@0.2.10-next.2 + - @backstage/plugin-sonarqube-backend@0.2.12-next.2 - @backstage/plugin-devtools-backend@0.2.7-next.2 - @backstage/plugin-linguist-backend@0.5.7-next.2 - @backstage/plugin-playlist-backend@0.3.14-next.2 - @backstage/plugin-catalog-backend@1.17.0-next.2 - - @backstage/plugin-explore-backend@0.0.20-next.2 - @backstage/plugin-jenkins-backend@0.3.4-next.2 - - @backstage/plugin-rollbar-backend@0.1.55-next.2 - @backstage/backend-tasks@0.5.15-next.2 - @backstage/plugin-badges-backend@0.3.7-next.2 - - @backstage/plugin-events-backend@0.2.19-next.2 - @backstage/plugin-nomad-backend@0.1.12-next.2 - @backstage/plugin-adr-backend@0.4.7-next.2 - @backstage/plugin-app-backend@0.3.58-next.2 - @backstage/plugin-auth-node@0.4.4-next.2 - - example-app@0.2.92-next.2 + - @backstage/plugin-notifications-backend@0.0.1-next.0 - @backstage/plugin-todo-backend@0.3.8-next.2 - - @backstage/plugin-kafka-backend@0.3.8-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.2 - @backstage/plugin-permission-backend@0.5.33-next.2 - @backstage/plugin-permission-node@0.7.21-next.2 - @backstage/plugin-proxy-backend@0.4.8-next.2 - @backstage/plugin-search-backend@1.5.0-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.13-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.19-next.2 - @backstage/plugin-search-backend-node@1.2.14-next.2 - @backstage/plugin-techdocs-backend@1.9.3-next.2 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.2 - - @backstage/plugin-catalog-node@1.6.2-next.2 - - @backstage/plugin-events-node@0.2.19-next.2 - - @backstage/config@1.1.1 - - @backstage/catalog-client@1.6.0-next.1 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/integration@1.9.0-next.0 - - @backstage/plugin-azure-sites-common@0.1.2-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.2 - @backstage/plugin-permission-common@0.7.12 - - @backstage/plugin-search-common@1.2.10 -## 0.2.92-next.1 +## 0.0.20-next.1 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.21.0-next.1 - @backstage/plugin-azure-devops-backend@0.5.2-next.1 - - @backstage/catalog-model@1.4.4-next.0 - - @backstage/catalog-client@1.6.0-next.1 - @backstage/plugin-catalog-backend@1.17.0-next.1 - - @backstage/backend-common@0.21.0-next.1 - - @backstage/plugin-auth-backend@0.20.4-next.1 - - @backstage/integration@1.9.0-next.0 - - @backstage/plugin-azure-sites-common@0.1.2-next.0 - - example-app@0.2.92-next.1 + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/backend-defaults@0.2.10-next.1 - @backstage/backend-tasks@0.5.15-next.1 - - @backstage/config@1.1.1 - @backstage/plugin-adr-backend@0.4.7-next.1 - @backstage/plugin-app-backend@0.3.58-next.1 - @backstage/plugin-auth-node@0.4.4-next.1 - @backstage/plugin-badges-backend@0.3.7-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.1 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.1 - - @backstage/plugin-catalog-node@1.6.2-next.1 - - @backstage/plugin-code-coverage-backend@0.2.24-next.1 - @backstage/plugin-devtools-backend@0.2.7-next.1 - @backstage/plugin-entity-feedback-backend@0.2.7-next.1 - - @backstage/plugin-events-backend@0.2.19-next.1 - - @backstage/plugin-events-node@0.2.19-next.1 - - @backstage/plugin-explore-backend@0.0.20-next.1 - @backstage/plugin-jenkins-backend@0.3.4-next.1 - - @backstage/plugin-kafka-backend@0.3.8-next.1 - @backstage/plugin-kubernetes-backend@0.14.2-next.1 - @backstage/plugin-lighthouse-backend@0.4.2-next.1 - @backstage/plugin-linguist-backend@0.5.7-next.1 - @backstage/plugin-nomad-backend@0.1.12-next.1 - @backstage/plugin-permission-backend@0.5.33-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.1 - @backstage/plugin-permission-common@0.7.12 - @backstage/plugin-permission-node@0.7.21-next.1 - @backstage/plugin-playlist-backend@0.3.14-next.1 - @backstage/plugin-proxy-backend@0.4.8-next.1 - - @backstage/plugin-rollbar-backend@0.1.55-next.1 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.11-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.27-next.1 - @backstage/plugin-search-backend@1.5.0-next.1 - @backstage/plugin-search-backend-module-catalog@0.1.14-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.13-next.1 - @backstage/plugin-search-backend-module-explore@0.1.14-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.19-next.1 - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.1 - @backstage/plugin-search-backend-node@1.2.14-next.1 - - @backstage/plugin-search-common@1.2.10 - - @backstage/plugin-signals-backend@0.0.1-next.1 - - @backstage/plugin-signals-node@0.0.1-next.1 - - @backstage/plugin-tech-insights-backend@0.5.24-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.42-next.1 - - @backstage/plugin-tech-insights-node@0.4.16-next.1 + - @backstage/plugin-sonarqube-backend@0.2.12-next.1 - @backstage/plugin-techdocs-backend@1.9.3-next.1 - @backstage/plugin-todo-backend@0.3.8-next.1 -## 0.2.92-next.0 +## 0.0.20-next.0 ### Patch Changes - Updated dependencies - - @backstage/plugin-scaffolder-backend-module-rails@0.4.27-next.0 - @backstage/plugin-azure-devops-backend@0.5.2-next.0 - - @backstage/plugin-explore-backend@0.0.20-next.0 - - @backstage/plugin-auth-backend@0.20.4-next.0 - - @backstage/backend-common@0.21.0-next.0 - @backstage/plugin-kubernetes-backend@0.14.2-next.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.11-next.0 - @backstage/plugin-catalog-backend@1.17.0-next.0 - @backstage/plugin-search-backend@1.5.0-next.0 - @backstage/plugin-todo-backend@0.3.8-next.0 - - @backstage/catalog-client@1.6.0-next.0 - - @backstage/plugin-signals-backend@0.0.1-next.0 - - @backstage/plugin-signals-node@0.0.1-next.0 - @backstage/plugin-scaffolder-backend@1.21.0-next.0 - @backstage/plugin-app-backend@0.3.58-next.0 - - example-app@0.2.92-next.0 + - @backstage/backend-defaults@0.2.10-next.0 - @backstage/backend-tasks@0.5.15-next.0 - @backstage/plugin-auth-node@0.4.4-next.0 - @backstage/plugin-badges-backend@0.3.7-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.27-next.0 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.7-next.0 - - @backstage/plugin-catalog-node@1.6.2-next.0 - @backstage/plugin-entity-feedback-backend@0.2.7-next.0 - - @backstage/plugin-events-backend@0.2.19-next.0 - @backstage/plugin-linguist-backend@0.5.7-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.7-next.0 - @backstage/plugin-permission-node@0.7.21-next.0 - @backstage/plugin-playlist-backend@0.3.14-next.0 - @backstage/plugin-proxy-backend@0.4.8-next.0 - - @backstage/plugin-rollbar-backend@0.1.55-next.0 - @backstage/plugin-search-backend-module-catalog@0.1.14-next.0 - @backstage/plugin-search-backend-module-explore@0.1.14-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.19-next.0 - @backstage/plugin-search-backend-module-techdocs@0.1.14-next.0 - - @backstage/plugin-tech-insights-backend@0.5.24-next.0 + - @backstage/plugin-sonarqube-backend@0.2.12-next.0 - @backstage/plugin-techdocs-backend@1.9.3-next.0 - @backstage/plugin-adr-backend@0.4.7-next.0 - - @backstage/plugin-azure-sites-backend@0.1.20-next.0 - - @backstage/plugin-code-coverage-backend@0.2.24-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.3-next.0 - @backstage/plugin-devtools-backend@0.2.7-next.0 - @backstage/plugin-jenkins-backend@0.3.4-next.0 - - @backstage/plugin-kafka-backend@0.3.8-next.0 - @backstage/plugin-lighthouse-backend@0.4.2-next.0 - @backstage/plugin-nomad-backend@0.1.12-next.0 - @backstage/plugin-permission-backend@0.5.33-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.13-next.0 - @backstage/plugin-search-backend-node@1.2.14-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.42-next.0 - - @backstage/plugin-tech-insights-node@0.4.16-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/integration@1.8.0 + - @backstage/backend-plugin-api@0.6.10-next.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.7-next.0 - - @backstage/plugin-events-node@0.2.19-next.0 - @backstage/plugin-permission-common@0.7.12 - - @backstage/plugin-search-common@1.2.10 -## 0.2.91 +## 0.0.19 ### Patch Changes - Updated dependencies - - @backstage/plugin-auth-backend@0.20.3 - - @backstage/backend-common@0.20.1 + - @backstage/plugin-sonarqube-backend@0.2.11 - @backstage/plugin-scaffolder-backend@1.20.0 - - @backstage/catalog-client@1.5.2 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10 - - @backstage/plugin-events-backend@0.2.18 + - @backstage/plugin-catalog-backend-module-openapi@0.1.26 - @backstage/plugin-search-backend-module-techdocs@0.1.13 - @backstage/plugin-search-backend-module-catalog@0.1.13 - @backstage/plugin-search-backend-module-explore@0.1.13 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-defaults@0.2.9 - @backstage/plugin-azure-devops-backend@0.5.1 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2 - @backstage/plugin-entity-feedback-backend@0.2.6 - - @backstage/plugin-code-coverage-backend@0.2.23 - - @backstage/plugin-azure-sites-backend@0.1.19 - - @backstage/plugin-tech-insights-node@0.4.15 - @backstage/plugin-devtools-backend@0.2.6 - @backstage/plugin-linguist-backend@0.5.6 - @backstage/plugin-playlist-backend@0.3.13 - @backstage/plugin-techdocs-backend@1.9.2 - - @backstage/plugin-explore-backend@0.0.19 - @backstage/plugin-jenkins-backend@0.3.3 - @backstage/plugin-badges-backend@0.3.6 - @backstage/plugin-search-backend@1.4.9 - - @backstage/plugin-kafka-backend@0.3.7 - @backstage/plugin-nomad-backend@0.1.11 - - @backstage/plugin-catalog-node@1.6.1 - @backstage/plugin-todo-backend@0.3.7 - @backstage/plugin-adr-backend@0.4.6 - @backstage/plugin-app-backend@0.3.57 @@ -982,211 +772,149 @@ - @backstage/plugin-permission-common@0.7.12 - @backstage/plugin-permission-node@0.7.20 - @backstage/plugin-catalog-backend@1.16.1 - - example-app@0.2.91 - @backstage/backend-tasks@0.5.14 - @backstage/plugin-auth-node@0.4.3 - @backstage/plugin-kubernetes-backend@0.14.1 - @backstage/plugin-lighthouse-backend@0.4.1 - @backstage/plugin-proxy-backend@0.4.7 - - @backstage/plugin-rollbar-backend@0.1.54 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.26 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.12 - - @backstage/plugin-search-backend-module-pg@0.5.18 - @backstage/plugin-search-backend-node@1.2.13 - - @backstage/plugin-tech-insights-backend@0.5.23 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/integration@1.8.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6 - - @backstage/plugin-events-node@0.2.18 - - @backstage/plugin-search-common@1.2.10 -## 0.2.91-next.2 +## 0.0.19-next.2 ### Patch Changes - Updated dependencies - - example-app@0.2.91-next.2 - - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-sonarqube-backend@0.2.11-next.2 + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-defaults@0.2.9-next.2 - @backstage/plugin-adr-backend@0.4.6-next.2 - @backstage/plugin-app-backend@0.3.57-next.2 - - @backstage/plugin-auth-backend@0.20.3-next.2 - @backstage/plugin-auth-node@0.4.3-next.2 - @backstage/plugin-azure-devops-backend@0.5.1-next.2 - @backstage/plugin-badges-backend@0.3.6-next.2 - @backstage/plugin-catalog-backend@1.16.1-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.2 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.2 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.2 - - @backstage/plugin-catalog-node@1.6.1-next.2 - - @backstage/plugin-code-coverage-backend@0.2.23-next.2 - @backstage/plugin-devtools-backend@0.2.6-next.2 - @backstage/plugin-entity-feedback-backend@0.2.6-next.2 - - @backstage/plugin-events-backend@0.2.18-next.2 - - @backstage/plugin-events-node@0.2.18-next.2 - @backstage/plugin-jenkins-backend@0.3.3-next.2 - - @backstage/plugin-kafka-backend@0.3.7-next.2 - @backstage/plugin-kubernetes-backend@0.14.1-next.2 - @backstage/plugin-lighthouse-backend@0.4.1-next.2 - @backstage/plugin-linguist-backend@0.5.6-next.2 - @backstage/plugin-nomad-backend@0.1.11-next.2 - @backstage/plugin-permission-backend@0.5.32-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.2 - @backstage/plugin-permission-node@0.7.20-next.2 - @backstage/plugin-playlist-backend@0.3.13-next.2 - @backstage/plugin-proxy-backend@0.4.7-next.2 - @backstage/plugin-scaffolder-backend@1.19.3-next.2 - @backstage/plugin-search-backend@1.4.9-next.2 - @backstage/plugin-search-backend-module-catalog@0.1.13-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.12-next.2 - @backstage/plugin-search-backend-module-explore@0.1.13-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.18-next.2 - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.2 - @backstage/plugin-search-backend-node@1.2.13-next.2 - @backstage/plugin-techdocs-backend@1.9.2-next.2 - @backstage/plugin-todo-backend@0.3.7-next.2 - @backstage/backend-tasks@0.5.14-next.2 - - @backstage/plugin-azure-sites-backend@0.1.19-next.2 - - @backstage/plugin-explore-backend@0.0.19-next.2 - - @backstage/plugin-rollbar-backend@0.1.54-next.2 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.26-next.2 - - @backstage/plugin-tech-insights-backend@0.5.23-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41-next.2 - - @backstage/plugin-tech-insights-node@0.4.15-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.2 -## 0.2.91-next.1 +## 0.0.19-next.1 ### Patch Changes - Updated dependencies - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10-next.1 - - example-app@0.2.91-next.1 - - @backstage/backend-common@0.20.1-next.1 - - @backstage/integration@1.8.0 - @backstage/plugin-app-backend@0.3.57-next.1 - @backstage/plugin-devtools-backend@0.2.6-next.1 - @backstage/plugin-proxy-backend@0.4.7-next.1 - - @backstage/config@1.1.1 + - @backstage/backend-defaults@0.2.9-next.1 - @backstage/plugin-kubernetes-backend@0.14.1-next.1 - @backstage/backend-tasks@0.5.14-next.1 - @backstage/plugin-adr-backend@0.4.6-next.1 - - @backstage/plugin-auth-backend@0.20.3-next.1 - @backstage/plugin-auth-node@0.4.3-next.1 - @backstage/plugin-azure-devops-backend@0.5.1-next.1 - - @backstage/plugin-azure-sites-backend@0.1.19-next.1 - @backstage/plugin-badges-backend@0.3.6-next.1 - @backstage/plugin-catalog-backend@1.16.1-next.1 - - @backstage/plugin-code-coverage-backend@0.2.23-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.1 - @backstage/plugin-entity-feedback-backend@0.2.6-next.1 - - @backstage/plugin-events-backend@0.2.18-next.1 - - @backstage/plugin-explore-backend@0.0.19-next.1 - @backstage/plugin-jenkins-backend@0.3.3-next.1 - - @backstage/plugin-kafka-backend@0.3.7-next.1 - @backstage/plugin-lighthouse-backend@0.4.1-next.1 - @backstage/plugin-linguist-backend@0.5.6-next.1 - @backstage/plugin-nomad-backend@0.1.11-next.1 - @backstage/plugin-permission-backend@0.5.32-next.1 - @backstage/plugin-permission-node@0.7.20-next.1 - @backstage/plugin-playlist-backend@0.3.13-next.1 - - @backstage/plugin-rollbar-backend@0.1.54-next.1 - @backstage/plugin-scaffolder-backend@1.19.3-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.26-next.1 - @backstage/plugin-search-backend@1.4.9-next.1 - @backstage/plugin-search-backend-module-catalog@0.1.13-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.12-next.1 - @backstage/plugin-search-backend-module-explore@0.1.13-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.18-next.1 - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.1 - @backstage/plugin-search-backend-node@1.2.13-next.1 - - @backstage/plugin-tech-insights-backend@0.5.23-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41-next.1 - - @backstage/plugin-tech-insights-node@0.4.15-next.1 + - @backstage/plugin-sonarqube-backend@0.2.11-next.1 - @backstage/plugin-techdocs-backend@1.9.2-next.1 - @backstage/plugin-todo-backend@0.3.7-next.1 - - @backstage/catalog-client@1.5.2-next.0 - - @backstage/catalog-model@1.4.3 + - @backstage/backend-plugin-api@0.6.9-next.1 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.1 - - @backstage/plugin-catalog-node@1.6.1-next.1 - - @backstage/plugin-events-node@0.2.18-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.1 - @backstage/plugin-permission-common@0.7.11 - - @backstage/plugin-search-common@1.2.9 -## 0.2.91-next.0 +## 0.0.19-next.0 ### Patch Changes - Updated dependencies - - @backstage/plugin-auth-backend@0.20.3-next.0 - - @backstage/backend-common@0.20.1-next.0 - @backstage/plugin-scaffolder-backend@1.19.3-next.0 - - @backstage/catalog-client@1.5.2-next.0 - @backstage/plugin-search-backend-module-techdocs@0.1.13-next.0 - @backstage/plugin-search-backend-module-catalog@0.1.13-next.0 - @backstage/plugin-search-backend-module-explore@0.1.13-next.0 - @backstage/plugin-azure-devops-backend@0.5.1-next.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.10-next.0 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.6-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.41-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.6-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.2-next.0 - @backstage/plugin-entity-feedback-backend@0.2.6-next.0 - - @backstage/plugin-code-coverage-backend@0.2.23-next.0 - - @backstage/plugin-azure-sites-backend@0.1.19-next.0 - - @backstage/plugin-tech-insights-node@0.4.15-next.0 - @backstage/plugin-devtools-backend@0.2.6-next.0 - @backstage/plugin-linguist-backend@0.5.6-next.0 - @backstage/plugin-playlist-backend@0.3.13-next.0 - @backstage/plugin-techdocs-backend@1.9.2-next.0 - - @backstage/plugin-explore-backend@0.0.19-next.0 - @backstage/plugin-jenkins-backend@0.3.3-next.0 - @backstage/plugin-badges-backend@0.3.6-next.0 - @backstage/plugin-search-backend@1.4.9-next.0 - - @backstage/plugin-kafka-backend@0.3.7-next.0 - @backstage/plugin-nomad-backend@0.1.11-next.0 - - @backstage/plugin-catalog-node@1.6.1-next.0 - @backstage/plugin-todo-backend@0.3.7-next.0 - @backstage/plugin-adr-backend@0.4.6-next.0 - @backstage/plugin-app-backend@0.3.57-next.0 - - example-app@0.2.91-next.0 + - @backstage/backend-defaults@0.2.9-next.0 + - @backstage/backend-plugin-api@0.6.9-next.0 - @backstage/backend-tasks@0.5.14-next.0 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/integration@1.8.0 - @backstage/plugin-auth-node@0.4.3-next.0 - @backstage/plugin-catalog-backend@1.16.1-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.26-next.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.6-next.0 - - @backstage/plugin-events-backend@0.2.18-next.0 - - @backstage/plugin-events-node@0.2.18-next.0 - @backstage/plugin-kubernetes-backend@0.14.1-next.0 - @backstage/plugin-lighthouse-backend@0.4.1-next.0 - @backstage/plugin-permission-backend@0.5.32-next.0 - @backstage/plugin-permission-common@0.7.11 - @backstage/plugin-permission-node@0.7.20-next.0 - @backstage/plugin-proxy-backend@0.4.7-next.0 - - @backstage/plugin-rollbar-backend@0.1.54-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.26-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.12-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.18-next.0 - @backstage/plugin-search-backend-node@1.2.13-next.0 - - @backstage/plugin-search-common@1.2.9 - - @backstage/plugin-tech-insights-backend@0.5.23-next.0 + - @backstage/plugin-sonarqube-backend@0.2.11-next.0 -## 0.2.90 +## 0.0.18 ### Patch Changes - Updated dependencies - - @backstage/plugin-auth-backend@0.20.1 - - @backstage/backend-common@0.20.0 - - @backstage/plugin-catalog-node@1.6.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1 - @backstage/plugin-techdocs-backend@1.9.1 - @backstage/plugin-catalog-backend@1.16.0 - - @backstage/catalog-client@1.5.0 - @backstage/plugin-azure-devops-backend@0.5.0 - @backstage/plugin-scaffolder-backend@1.19.2 - @backstage/backend-tasks@0.5.13 - @backstage/plugin-lighthouse-backend@0.4.0 - @backstage/plugin-kubernetes-backend@0.14.0 - - @backstage/integration@1.8.0 - - @backstage/plugin-azure-sites-backend@0.1.18 - @backstage/plugin-auth-node@0.4.2 - @backstage/plugin-permission-backend@0.5.31 - @backstage/plugin-permission-common@0.7.11 @@ -1194,134 +922,94 @@ - @backstage/plugin-permission-node@0.7.19 - @backstage/plugin-search-backend@1.4.8 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.11 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5 - @backstage/plugin-search-backend-module-techdocs@0.1.12 - @backstage/plugin-search-backend-module-catalog@0.1.12 - @backstage/plugin-search-backend-module-explore@0.1.12 - - @backstage/plugin-search-backend-module-pg@0.5.17 - - @backstage/plugin-events-backend@0.2.17 - - example-app@0.2.90 + - @backstage/backend-defaults@0.2.8 - @backstage/plugin-adr-backend@0.4.5 - @backstage/plugin-app-backend@0.3.56 - @backstage/plugin-badges-backend@0.3.5 - - @backstage/plugin-code-coverage-backend@0.2.22 + - @backstage/plugin-catalog-backend-module-openapi@0.1.25 - @backstage/plugin-devtools-backend@0.2.5 - @backstage/plugin-entity-feedback-backend@0.2.5 - - @backstage/plugin-explore-backend@0.0.18 - @backstage/plugin-jenkins-backend@0.3.2 - - @backstage/plugin-kafka-backend@0.3.6 - @backstage/plugin-linguist-backend@0.5.5 - @backstage/plugin-nomad-backend@0.1.10 - @backstage/plugin-proxy-backend@0.4.6 - - @backstage/plugin-rollbar-backend@0.1.53 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.9 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.25 - @backstage/plugin-search-backend-node@1.2.12 - - @backstage/plugin-tech-insights-backend@0.5.22 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.40 - - @backstage/plugin-tech-insights-node@0.4.14 + - @backstage/plugin-sonarqube-backend@0.2.10 - @backstage/plugin-todo-backend@0.3.6 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/plugin-events-node@0.2.17 - - @backstage/plugin-search-common@1.2.9 + - @backstage/backend-plugin-api@0.6.8 -## 0.2.90-next.3 +## 0.0.18-next.3 ### Patch Changes - Updated dependencies - @backstage/plugin-azure-devops-backend@0.5.0-next.3 - @backstage/plugin-scaffolder-backend@1.19.2-next.3 - - @backstage/backend-common@0.20.0-next.3 - - example-app@0.2.90-next.4 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.9-next.3 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.25-next.3 + - @backstage/backend-defaults@0.2.8-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 - @backstage/backend-tasks@0.5.13-next.3 - - @backstage/catalog-client@1.5.0-next.1 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/integration@1.8.0-next.1 - @backstage/plugin-adr-backend@0.4.5-next.3 - @backstage/plugin-app-backend@0.3.56-next.3 - - @backstage/plugin-auth-backend@0.20.1-next.3 - @backstage/plugin-auth-node@0.4.2-next.3 - - @backstage/plugin-azure-sites-backend@0.1.18-next.3 - @backstage/plugin-badges-backend@0.3.5-next.3 - @backstage/plugin-catalog-backend@1.16.0-next.3 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.3 + - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.3 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.3 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.3 - - @backstage/plugin-catalog-node@1.6.0-next.3 - - @backstage/plugin-code-coverage-backend@0.2.22-next.3 - @backstage/plugin-devtools-backend@0.2.5-next.3 - @backstage/plugin-entity-feedback-backend@0.2.5-next.3 - - @backstage/plugin-events-backend@0.2.17-next.3 - - @backstage/plugin-events-node@0.2.17-next.3 - - @backstage/plugin-explore-backend@0.0.18-next.3 - @backstage/plugin-jenkins-backend@0.3.2-next.3 - - @backstage/plugin-kafka-backend@0.3.6-next.3 - @backstage/plugin-kubernetes-backend@0.14.0-next.3 - @backstage/plugin-lighthouse-backend@0.4.0-next.3 - @backstage/plugin-linguist-backend@0.5.5-next.3 - @backstage/plugin-nomad-backend@0.1.10-next.3 - @backstage/plugin-permission-backend@0.5.31-next.3 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.3 - @backstage/plugin-permission-common@0.7.10 - @backstage/plugin-permission-node@0.7.19-next.3 - @backstage/plugin-playlist-backend@0.3.12-next.3 - @backstage/plugin-proxy-backend@0.4.6-next.3 - - @backstage/plugin-rollbar-backend@0.1.53-next.3 - @backstage/plugin-search-backend@1.4.8-next.3 - @backstage/plugin-search-backend-module-catalog@0.1.12-next.3 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.11-next.3 - @backstage/plugin-search-backend-module-explore@0.1.12-next.3 - - @backstage/plugin-search-backend-module-pg@0.5.17-next.3 - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.3 - @backstage/plugin-search-backend-node@1.2.12-next.3 - - @backstage/plugin-search-common@1.2.8 - - @backstage/plugin-tech-insights-backend@0.5.22-next.3 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.40-next.3 - - @backstage/plugin-tech-insights-node@0.4.14-next.3 + - @backstage/plugin-sonarqube-backend@0.2.10-next.3 - @backstage/plugin-techdocs-backend@1.9.1-next.3 - @backstage/plugin-todo-backend@0.3.6-next.3 -## 0.2.90-next.2 +## 0.0.18-next.2 ### Patch Changes - Updated dependencies - - @backstage/plugin-catalog-node@1.6.0-next.2 - @backstage/plugin-catalog-backend@1.16.0-next.2 - - @backstage/plugin-auth-backend@0.20.1-next.2 - @backstage/plugin-lighthouse-backend@0.4.0-next.2 - - @backstage/backend-common@0.20.0-next.2 - @backstage/plugin-auth-node@0.4.2-next.2 - - @backstage/catalog-client@1.5.0-next.1 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.11-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.2 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.2 - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.2 - @backstage/plugin-search-backend-module-catalog@0.1.12-next.2 - @backstage/plugin-search-backend-module-explore@0.1.12-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.17-next.2 - - @backstage/plugin-events-backend@0.2.17-next.2 - - example-app@0.2.90-next.3 + - @backstage/backend-defaults@0.2.8-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 - @backstage/backend-tasks@0.5.13-next.2 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - - @backstage/integration@1.8.0-next.1 - @backstage/plugin-adr-backend@0.4.5-next.2 - @backstage/plugin-app-backend@0.3.56-next.2 - @backstage/plugin-azure-devops-backend@0.5.0-next.2 - - @backstage/plugin-azure-sites-backend@0.1.18-next.2 - @backstage/plugin-badges-backend@0.3.5-next.2 - - @backstage/plugin-code-coverage-backend@0.2.22-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.2 - @backstage/plugin-devtools-backend@0.2.5-next.2 - @backstage/plugin-entity-feedback-backend@0.2.5-next.2 - - @backstage/plugin-events-node@0.2.17-next.2 - - @backstage/plugin-explore-backend@0.0.18-next.2 - @backstage/plugin-jenkins-backend@0.3.2-next.2 - - @backstage/plugin-kafka-backend@0.3.6-next.2 - @backstage/plugin-kubernetes-backend@0.14.0-next.2 - @backstage/plugin-linguist-backend@0.5.5-next.2 - @backstage/plugin-nomad-backend@0.1.10-next.2 @@ -1330,230 +1018,165 @@ - @backstage/plugin-permission-node@0.7.19-next.2 - @backstage/plugin-playlist-backend@0.3.12-next.2 - @backstage/plugin-proxy-backend@0.4.6-next.2 - - @backstage/plugin-rollbar-backend@0.1.53-next.2 - @backstage/plugin-scaffolder-backend@1.19.2-next.2 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.9-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.25-next.2 - @backstage/plugin-search-backend@1.4.8-next.2 - @backstage/plugin-search-backend-node@1.2.12-next.2 - - @backstage/plugin-search-common@1.2.8 - - @backstage/plugin-tech-insights-backend@0.5.22-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.40-next.2 - - @backstage/plugin-tech-insights-node@0.4.14-next.2 + - @backstage/plugin-sonarqube-backend@0.2.10-next.2 - @backstage/plugin-techdocs-backend@1.9.1-next.2 - @backstage/plugin-todo-backend@0.3.6-next.2 -## 0.2.90-next.1 +## 0.0.18-next.1 ### Patch Changes - Updated dependencies - - @backstage/plugin-auth-backend@0.20.1-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.1 - @backstage/plugin-catalog-backend@1.15.1-next.1 - - @backstage/catalog-client@1.5.0-next.0 - @backstage/plugin-azure-devops-backend@0.5.0-next.1 - @backstage/plugin-kubernetes-backend@0.14.0-next.1 - - @backstage/integration@1.8.0-next.1 - - @backstage/plugin-azure-sites-backend@0.1.18-next.1 - - @backstage/backend-common@0.20.0-next.1 - - example-app@0.2.90-next.2 + - @backstage/backend-defaults@0.2.8-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 - @backstage/backend-tasks@0.5.13-next.1 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - @backstage/plugin-adr-backend@0.4.5-next.1 - @backstage/plugin-app-backend@0.3.56-next.1 - @backstage/plugin-auth-node@0.4.2-next.1 - @backstage/plugin-badges-backend@0.3.5-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.1 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.1 - - @backstage/plugin-catalog-node@1.5.1-next.1 - - @backstage/plugin-code-coverage-backend@0.2.22-next.1 - @backstage/plugin-devtools-backend@0.2.5-next.1 - @backstage/plugin-entity-feedback-backend@0.2.5-next.1 - - @backstage/plugin-events-backend@0.2.17-next.1 - - @backstage/plugin-events-node@0.2.17-next.1 - - @backstage/plugin-explore-backend@0.0.18-next.1 - @backstage/plugin-jenkins-backend@0.3.2-next.1 - - @backstage/plugin-kafka-backend@0.3.6-next.1 - @backstage/plugin-lighthouse-backend@0.3.5-next.1 - @backstage/plugin-linguist-backend@0.5.5-next.1 - @backstage/plugin-nomad-backend@0.1.10-next.1 - @backstage/plugin-permission-backend@0.5.31-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.1 - @backstage/plugin-permission-common@0.7.10 - @backstage/plugin-permission-node@0.7.19-next.1 - @backstage/plugin-playlist-backend@0.3.12-next.1 - @backstage/plugin-proxy-backend@0.4.6-next.1 - - @backstage/plugin-rollbar-backend@0.1.53-next.1 - @backstage/plugin-scaffolder-backend@1.19.2-next.1 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.9-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.25-next.1 - @backstage/plugin-search-backend@1.4.8-next.1 - @backstage/plugin-search-backend-module-catalog@0.1.12-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.11-next.1 - @backstage/plugin-search-backend-module-explore@0.1.12-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.17-next.1 - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.1 - @backstage/plugin-search-backend-node@1.2.12-next.1 - - @backstage/plugin-search-common@1.2.8 - - @backstage/plugin-tech-insights-backend@0.5.22-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.40-next.1 - - @backstage/plugin-tech-insights-node@0.4.14-next.1 + - @backstage/plugin-sonarqube-backend@0.2.10-next.1 - @backstage/plugin-techdocs-backend@1.9.1-next.1 - @backstage/plugin-todo-backend@0.3.6-next.1 -## 0.2.90-next.0 +## 0.0.18-next.0 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.20.0-next.0 - - @backstage/plugin-auth-backend@0.20.1-next.0 - @backstage/backend-tasks@0.5.13-next.0 - @backstage/plugin-scaffolder-backend@1.19.2-next.0 - @backstage/plugin-kubernetes-backend@0.14.0-next.0 - - @backstage/plugin-azure-sites-backend@0.1.18-next.0 - - @backstage/integration@1.8.0-next.0 - - example-app@0.2.90-next.0 + - @backstage/backend-defaults@0.2.8-next.0 - @backstage/plugin-adr-backend@0.4.5-next.0 - @backstage/plugin-app-backend@0.3.56-next.0 - @backstage/plugin-auth-node@0.4.2-next.0 - @backstage/plugin-azure-devops-backend@0.4.5-next.0 - @backstage/plugin-badges-backend@0.3.5-next.0 - @backstage/plugin-catalog-backend@1.15.1-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.1-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.25-next.0 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.5-next.0 - - @backstage/plugin-catalog-node@1.5.1-next.0 - - @backstage/plugin-code-coverage-backend@0.2.22-next.0 - @backstage/plugin-devtools-backend@0.2.5-next.0 - @backstage/plugin-entity-feedback-backend@0.2.5-next.0 - - @backstage/plugin-events-backend@0.2.17-next.0 - - @backstage/plugin-explore-backend@0.0.18-next.0 - @backstage/plugin-jenkins-backend@0.3.2-next.0 - - @backstage/plugin-kafka-backend@0.3.6-next.0 - @backstage/plugin-lighthouse-backend@0.3.5-next.0 - @backstage/plugin-linguist-backend@0.5.5-next.0 - @backstage/plugin-nomad-backend@0.1.10-next.0 - @backstage/plugin-permission-backend@0.5.31-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.5-next.0 - @backstage/plugin-permission-node@0.7.19-next.0 - @backstage/plugin-playlist-backend@0.3.12-next.0 - @backstage/plugin-proxy-backend@0.4.6-next.0 - - @backstage/plugin-rollbar-backend@0.1.53-next.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.9-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.25-next.0 - @backstage/plugin-search-backend@1.4.8-next.0 - @backstage/plugin-search-backend-module-catalog@0.1.12-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.11-next.0 - @backstage/plugin-search-backend-module-explore@0.1.12-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.17-next.0 - @backstage/plugin-search-backend-module-techdocs@0.1.12-next.0 - @backstage/plugin-search-backend-node@1.2.12-next.0 - - @backstage/plugin-tech-insights-backend@0.5.22-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.40-next.0 - - @backstage/plugin-tech-insights-node@0.4.14-next.0 + - @backstage/plugin-sonarqube-backend@0.2.10-next.0 - @backstage/plugin-techdocs-backend@1.9.1-next.0 - @backstage/plugin-todo-backend@0.3.6-next.0 - - @backstage/catalog-client@1.4.6 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 + - @backstage/backend-plugin-api@0.6.8-next.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.5-next.0 - - @backstage/plugin-events-node@0.2.17-next.0 - @backstage/plugin-permission-common@0.7.10 - - @backstage/plugin-search-common@1.2.8 -## 0.2.89 +## 0.0.17 ### Patch Changes - Updated dependencies - @backstage/plugin-catalog-backend@1.15.0 - - @backstage/plugin-catalog-node@1.5.0 - - @backstage/plugin-search-backend-module-pg@0.5.16 - @backstage/plugin-kubernetes-backend@0.13.1 - @backstage/plugin-search-backend-node@1.2.11 - - @backstage/integration@1.7.2 - - @backstage/plugin-auth-backend@0.20.0 - - @backstage/backend-common@0.19.9 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0 - @backstage/plugin-techdocs-backend@1.9.0 - - @backstage/plugin-code-coverage-backend@0.2.21 - @backstage/plugin-scaffolder-backend@1.19.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.10 - @backstage/plugin-search-backend@1.4.7 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4 - @backstage/plugin-entity-feedback-backend@0.2.4 - - @backstage/plugin-tech-insights-backend@0.5.21 + - @backstage/backend-plugin-api@0.6.7 - @backstage/plugin-linguist-backend@0.5.4 - @backstage/plugin-playlist-backend@0.3.11 - @backstage/backend-tasks@0.5.12 - @backstage/plugin-badges-backend@0.3.4 - @backstage/plugin-app-backend@0.3.55 - @backstage/plugin-search-backend-module-techdocs@0.1.11 - - @backstage/catalog-client@1.4.6 - @backstage/plugin-permission-common@0.7.10 - @backstage/plugin-jenkins-backend@0.3.1 - @backstage/plugin-adr-backend@0.4.4 - - @backstage/plugin-kafka-backend@0.3.5 - @backstage/plugin-proxy-backend@0.4.5 - - example-app@0.2.89 + - @backstage/plugin-catalog-backend-module-openapi@0.1.24 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4 - @backstage/plugin-lighthouse-backend@0.3.4 - @backstage/plugin-search-backend-module-catalog@0.1.11 - @backstage/plugin-todo-backend@0.3.5 - @backstage/plugin-devtools-backend@0.2.4 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 + - @backstage/backend-defaults@0.2.7 - @backstage/plugin-auth-node@0.4.1 - @backstage/plugin-azure-devops-backend@0.4.4 - - @backstage/plugin-azure-sites-backend@0.1.17 - - @backstage/plugin-events-backend@0.2.16 - - @backstage/plugin-events-node@0.2.16 - - @backstage/plugin-explore-backend@0.0.17 - - @backstage/plugin-graphql-backend@0.2.1 - @backstage/plugin-nomad-backend@0.1.9 - @backstage/plugin-permission-backend@0.5.30 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4 - @backstage/plugin-permission-node@0.7.18 - - @backstage/plugin-rollbar-backend@0.1.52 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.8 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.24 - @backstage/plugin-search-backend-module-explore@0.1.11 - - @backstage/plugin-search-common@1.2.8 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.39 - - @backstage/plugin-tech-insights-node@0.4.13 + - @backstage/plugin-sonarqube-backend@0.2.9 -## 0.2.89-next.2 +## 0.0.17-next.2 ### Patch Changes - Updated dependencies - @backstage/plugin-kubernetes-backend@0.13.1-next.2 - @backstage/plugin-scaffolder-backend@1.19.0-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.10-next.2 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.16-next.2 - @backstage/plugin-entity-feedback-backend@0.2.4-next.2 - - @backstage/plugin-code-coverage-backend@0.2.21-next.2 - - @backstage/plugin-tech-insights-backend@0.5.21-next.2 + - @backstage/backend-plugin-api@0.6.7-next.2 - @backstage/plugin-linguist-backend@0.5.4-next.2 - @backstage/plugin-playlist-backend@0.3.11-next.2 - @backstage/plugin-techdocs-backend@1.9.0-next.2 - - @backstage/backend-common@0.19.9-next.2 - @backstage/plugin-catalog-backend@1.15.0-next.2 - @backstage/backend-tasks@0.5.12-next.2 - @backstage/plugin-badges-backend@0.3.4-next.2 - - @backstage/plugin-auth-backend@0.20.0-next.2 - @backstage/plugin-app-backend@0.3.55-next.2 - - example-app@0.2.89-next.2 + - @backstage/backend-defaults@0.2.7-next.2 - @backstage/plugin-adr-backend@0.4.4-next.2 - @backstage/plugin-auth-node@0.4.1-next.2 - @backstage/plugin-azure-devops-backend@0.4.4-next.2 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0-next.2 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.2 - - @backstage/plugin-catalog-node@1.5.0-next.2 - @backstage/plugin-devtools-backend@0.2.4-next.2 - - @backstage/plugin-events-backend@0.2.16-next.2 - - @backstage/plugin-events-node@0.2.16-next.2 - @backstage/plugin-jenkins-backend@0.3.1-next.2 - - @backstage/plugin-kafka-backend@0.3.5-next.2 - @backstage/plugin-lighthouse-backend@0.3.4-next.2 - @backstage/plugin-nomad-backend@0.1.9-next.2 - @backstage/plugin-permission-backend@0.5.30-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4-next.2 - @backstage/plugin-permission-node@0.7.18-next.2 - @backstage/plugin-proxy-backend@0.4.5-next.2 - @backstage/plugin-search-backend@1.4.7-next.2 @@ -1561,27 +1184,20 @@ - @backstage/plugin-search-backend-module-explore@0.1.11-next.2 - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.2 - @backstage/plugin-search-backend-node@1.2.11-next.2 + - @backstage/plugin-sonarqube-backend@0.2.9-next.2 - @backstage/plugin-todo-backend@0.3.5-next.2 - - @backstage/plugin-rollbar-backend@0.1.52-next.2 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.8-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.24-next.2 - - @backstage/plugin-azure-sites-backend@0.1.17-next.2 - - @backstage/plugin-explore-backend@0.0.17-next.2 - - @backstage/plugin-graphql-backend@0.2.1-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.39-next.2 - - @backstage/plugin-tech-insights-node@0.4.13-next.2 + - @backstage/plugin-catalog-backend-module-openapi@0.1.24-next.2 -## 0.2.89-next.1 +## 0.0.17-next.1 ### Patch Changes - Updated dependencies - @backstage/plugin-catalog-backend@1.15.0-next.1 - - @backstage/plugin-catalog-node@1.5.0-next.1 - - @backstage/integration@1.7.2-next.0 - - @backstage/plugin-auth-backend@0.20.0-next.1 - @backstage/plugin-techdocs-backend@1.9.0-next.1 - @backstage/plugin-scaffolder-backend@1.19.0-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.1.24-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0-next.1 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.1 - @backstage/plugin-jenkins-backend@0.3.1-next.1 - @backstage/plugin-kubernetes-backend@0.13.1-next.1 @@ -1590,351 +1206,230 @@ - @backstage/plugin-search-backend-module-catalog@0.1.11-next.1 - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.1 - @backstage/plugin-todo-backend@0.3.5-next.1 - - example-app@0.2.89-next.1 - - @backstage/backend-common@0.19.9-next.1 - @backstage/plugin-adr-backend@0.4.4-next.1 - - @backstage/plugin-code-coverage-backend@0.2.21-next.1 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.8-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.24-next.1 + - @backstage/backend-defaults@0.2.7-next.1 - @backstage/backend-tasks@0.5.12-next.1 - @backstage/plugin-app-backend@0.3.55-next.1 - @backstage/plugin-auth-node@0.4.1-next.1 - @backstage/plugin-badges-backend@0.3.4-next.1 - @backstage/plugin-entity-feedback-backend@0.2.4-next.1 - - @backstage/plugin-events-backend@0.2.16-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4-next.1 - @backstage/plugin-permission-node@0.7.18-next.1 - @backstage/plugin-playlist-backend@0.3.11-next.1 - @backstage/plugin-proxy-backend@0.4.5-next.1 - - @backstage/plugin-rollbar-backend@0.1.52-next.1 - @backstage/plugin-search-backend@1.4.7-next.1 - @backstage/plugin-search-backend-module-explore@0.1.11-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.16-next.1 - - @backstage/plugin-tech-insights-backend@0.5.21-next.1 + - @backstage/plugin-sonarqube-backend@0.2.9-next.1 - @backstage/plugin-azure-devops-backend@0.4.4-next.1 - - @backstage/plugin-azure-sites-backend@0.1.17-next.1 - @backstage/plugin-devtools-backend@0.2.4-next.1 - - @backstage/plugin-explore-backend@0.0.17-next.1 - - @backstage/plugin-graphql-backend@0.2.1-next.1 - - @backstage/plugin-kafka-backend@0.3.5-next.1 - @backstage/plugin-nomad-backend@0.1.9-next.1 - @backstage/plugin-permission-backend@0.5.30-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.10-next.1 - @backstage/plugin-search-backend-node@1.2.11-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.39-next.1 - - @backstage/plugin-tech-insights-node@0.4.13-next.1 - - @backstage/catalog-client@1.4.5 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 + - @backstage/backend-plugin-api@0.6.7-next.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.1 - - @backstage/plugin-events-node@0.2.16-next.1 - @backstage/plugin-permission-common@0.7.9 - - @backstage/plugin-search-common@1.2.7 -## 0.2.89-next.0 +## 0.0.17-next.0 ### Patch Changes - Updated dependencies - @backstage/plugin-search-backend-node@1.2.11-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.1.0-next.0 - @backstage/plugin-techdocs-backend@1.8.1-next.0 - - @backstage/plugin-code-coverage-backend@0.2.21-next.0 - @backstage/plugin-scaffolder-backend@1.19.0-next.0 - @backstage/plugin-catalog-backend@1.15.0-next.0 - @backstage/plugin-search-backend@1.4.7-next.0 - - @backstage/plugin-tech-insights-backend@0.5.21-next.0 - @backstage/plugin-search-backend-module-techdocs@0.1.11-next.0 - - @backstage/plugin-kafka-backend@0.3.5-next.0 - @backstage/plugin-proxy-backend@0.4.5-next.0 - - @backstage/plugin-auth-backend@0.20.0-next.0 - - @backstage/backend-common@0.19.9-next.0 - - @backstage/integration@1.7.1 - @backstage/plugin-app-backend@0.3.55-next.0 - @backstage/plugin-devtools-backend@0.2.4-next.0 - - example-app@0.2.89-next.0 + - @backstage/backend-defaults@0.2.7-next.0 + - @backstage/backend-plugin-api@0.6.7-next.0 - @backstage/backend-tasks@0.5.12-next.0 - - @backstage/catalog-client@1.4.5 - - @backstage/catalog-model@1.4.3 - - @backstage/config@1.1.1 - @backstage/plugin-adr-backend@0.4.4-next.0 - @backstage/plugin-auth-node@0.4.1-next.0 - @backstage/plugin-azure-devops-backend@0.4.4-next.0 - - @backstage/plugin-azure-sites-backend@0.1.17-next.0 - @backstage/plugin-badges-backend@0.3.4-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.1.24-next.0 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.4-next.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.4-next.0 - - @backstage/plugin-catalog-node@1.4.8-next.0 - @backstage/plugin-entity-feedback-backend@0.2.4-next.0 - - @backstage/plugin-events-backend@0.2.16-next.0 - - @backstage/plugin-events-node@0.2.16-next.0 - - @backstage/plugin-explore-backend@0.0.17-next.0 - - @backstage/plugin-graphql-backend@0.2.1-next.0 - @backstage/plugin-jenkins-backend@0.3.1-next.0 - @backstage/plugin-kubernetes-backend@0.13.1-next.0 - @backstage/plugin-lighthouse-backend@0.3.4-next.0 - @backstage/plugin-linguist-backend@0.5.4-next.0 - @backstage/plugin-nomad-backend@0.1.9-next.0 - @backstage/plugin-permission-backend@0.5.30-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.4-next.0 - @backstage/plugin-permission-common@0.7.9 - @backstage/plugin-permission-node@0.7.18-next.0 - @backstage/plugin-playlist-backend@0.3.11-next.0 - - @backstage/plugin-rollbar-backend@0.1.52-next.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.8-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.24-next.0 - @backstage/plugin-search-backend-module-catalog@0.1.11-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.10-next.0 - @backstage/plugin-search-backend-module-explore@0.1.11-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.16-next.0 - - @backstage/plugin-search-common@1.2.7 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.39-next.0 - - @backstage/plugin-tech-insights-node@0.4.13-next.0 + - @backstage/plugin-sonarqube-backend@0.2.9-next.0 - @backstage/plugin-todo-backend@0.3.5-next.0 -## 0.2.88 +## 0.0.16 ### Patch Changes - Updated dependencies - @backstage/plugin-nomad-backend@0.1.8 - @backstage/backend-tasks@0.5.11 - - @backstage/backend-common@0.19.8 + - @backstage/plugin-sonarqube-backend@0.2.8 - @backstage/plugin-scaffolder-backend@1.18.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.9 - - @backstage/integration@1.7.1 - @backstage/plugin-playlist-backend@0.3.10 - @backstage/plugin-techdocs-backend@1.8.0 - - @backstage/plugin-auth-backend@0.19.3 - - @backstage/plugin-rollbar-backend@0.1.51 - @backstage/plugin-catalog-backend@1.14.0 - - @backstage/plugin-catalog-node@1.4.7 - @backstage/plugin-auth-node@0.4.0 - - @backstage/plugin-graphql-backend@0.2.0 - - @backstage/catalog-model@1.4.3 - @backstage/plugin-badges-backend@0.3.3 - - @backstage/plugin-tech-insights-backend@0.5.20 - @backstage/plugin-kubernetes-backend@0.13.0 - @backstage/plugin-jenkins-backend@0.3.0 - - @backstage/plugin-code-coverage-backend@0.2.20 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.23 - @backstage/plugin-search-backend@1.4.6 - - example-app@0.2.88 + - @backstage/backend-plugin-api@0.6.6 - @backstage/plugin-lighthouse-backend@0.3.3 - @backstage/plugin-linguist-backend@0.5.3 - @backstage/plugin-search-backend-module-catalog@0.1.10 - @backstage/plugin-search-backend-module-explore@0.1.10 - @backstage/plugin-search-backend-module-techdocs@0.1.10 - @backstage/plugin-search-backend-node@1.2.10 - - @backstage/plugin-tech-insights-node@0.4.12 + - @backstage/backend-defaults@0.2.6 - @backstage/plugin-adr-backend@0.4.3 - @backstage/plugin-app-backend@0.3.54 - @backstage/plugin-azure-devops-backend@0.4.3 - - @backstage/plugin-azure-sites-backend@0.1.16 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.3 - @backstage/plugin-devtools-backend@0.2.3 - @backstage/plugin-entity-feedback-backend@0.2.3 - - @backstage/plugin-events-backend@0.2.15 - - @backstage/plugin-explore-backend@0.0.16 - - @backstage/plugin-kafka-backend@0.3.3 - @backstage/plugin-permission-backend@0.5.29 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.3 - @backstage/plugin-permission-node@0.7.17 - @backstage/plugin-proxy-backend@0.4.3 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.7 - - @backstage/plugin-search-backend-module-pg@0.5.15 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.38 - @backstage/plugin-todo-backend@0.3.4 - - @backstage/catalog-client@1.4.5 - - @backstage/config@1.1.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.3 - - @backstage/plugin-events-node@0.2.15 - @backstage/plugin-permission-common@0.7.9 - - @backstage/plugin-search-common@1.2.7 -## 0.2.88-next.2 +## 0.0.16-next.2 ### Patch Changes - Updated dependencies - @backstage/plugin-nomad-backend@0.1.8-next.2 - - @backstage/backend-common@0.19.8-next.2 - @backstage/plugin-scaffolder-backend@1.18.0-next.2 - @backstage/plugin-techdocs-backend@1.8.0-next.2 - @backstage/plugin-auth-node@0.4.0-next.2 - @backstage/plugin-catalog-backend@1.14.0-next.2 - - @backstage/catalog-model@1.4.3-next.0 - - @backstage/integration@1.7.1-next.1 - @backstage/plugin-kubernetes-backend@0.12.3-next.2 - @backstage/plugin-jenkins-backend@0.2.9-next.2 - - @backstage/plugin-auth-backend@0.19.3-next.2 + - @backstage/backend-defaults@0.2.6-next.2 - @backstage/backend-tasks@0.5.11-next.2 - @backstage/plugin-adr-backend@0.4.3-next.2 - @backstage/plugin-app-backend@0.3.54-next.2 - @backstage/plugin-azure-devops-backend@0.4.3-next.2 - - @backstage/plugin-azure-sites-backend@0.1.16-next.2 - @backstage/plugin-badges-backend@0.3.3-next.2 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.3-next.2 - - @backstage/plugin-catalog-node@1.4.7-next.2 - - @backstage/plugin-code-coverage-backend@0.2.20-next.2 - @backstage/plugin-devtools-backend@0.2.3-next.2 - @backstage/plugin-entity-feedback-backend@0.2.3-next.2 - - @backstage/plugin-events-backend@0.2.15-next.2 - - @backstage/plugin-explore-backend@0.0.16-next.2 - - @backstage/plugin-graphql-backend@0.1.44-next.2 - - @backstage/plugin-kafka-backend@0.3.3-next.2 - @backstage/plugin-lighthouse-backend@0.3.3-next.2 - @backstage/plugin-linguist-backend@0.5.3-next.2 - @backstage/plugin-permission-backend@0.5.29-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.3-next.2 - @backstage/plugin-permission-node@0.7.17-next.2 - @backstage/plugin-playlist-backend@0.3.10-next.2 - @backstage/plugin-proxy-backend@0.4.3-next.2 - - @backstage/plugin-rollbar-backend@0.1.51-next.2 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.7-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.23-next.2 - @backstage/plugin-search-backend@1.4.6-next.2 - @backstage/plugin-search-backend-module-catalog@0.1.10-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.9-next.2 - @backstage/plugin-search-backend-module-explore@0.1.10-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.15-next.2 - @backstage/plugin-search-backend-module-techdocs@0.1.10-next.2 - @backstage/plugin-search-backend-node@1.2.10-next.2 - - @backstage/plugin-tech-insights-backend@0.5.20-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.38-next.2 - - @backstage/plugin-tech-insights-node@0.4.12-next.2 + - @backstage/plugin-sonarqube-backend@0.2.8-next.2 - @backstage/plugin-todo-backend@0.3.4-next.2 - - example-app@0.2.88-next.2 - - @backstage/catalog-client@1.4.5-next.0 - - @backstage/config@1.1.1-next.0 + - @backstage/backend-plugin-api@0.6.6-next.2 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.3-next.2 - - @backstage/plugin-events-node@0.2.15-next.2 - @backstage/plugin-permission-common@0.7.9-next.0 - - @backstage/plugin-search-common@1.2.7-next.0 -## 0.2.88-next.1 +## 0.0.16-next.1 ### Patch Changes - Updated dependencies - @backstage/backend-tasks@0.5.10-next.1 - @backstage/plugin-catalog-backend@1.14.0-next.1 - - @backstage/plugin-catalog-node@1.4.6-next.1 - - @backstage/backend-common@0.19.7-next.1 - @backstage/plugin-scaffolder-backend@1.18.0-next.1 - @backstage/plugin-badges-backend@0.3.2-next.1 + - @backstage/backend-plugin-api@0.6.5-next.1 - @backstage/plugin-lighthouse-backend@0.3.2-next.1 - @backstage/plugin-linguist-backend@0.5.2-next.1 - @backstage/plugin-search-backend-module-catalog@0.1.9-next.1 - @backstage/plugin-search-backend-module-explore@0.1.9-next.1 - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.1 - @backstage/plugin-search-backend-node@1.2.9-next.1 - - @backstage/plugin-tech-insights-backend@0.5.19-next.1 - - @backstage/plugin-tech-insights-node@0.4.11-next.1 - - example-app@0.2.88-next.1 - - @backstage/plugin-auth-backend@0.19.2-next.1 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.1 - @backstage/plugin-kubernetes-backend@0.12.2-next.1 - @backstage/plugin-todo-backend@0.3.3-next.1 + - @backstage/backend-defaults@0.2.5-next.1 - @backstage/plugin-adr-backend@0.4.2-next.1 - @backstage/plugin-app-backend@0.3.53-next.1 - @backstage/plugin-auth-node@0.3.2-next.1 - @backstage/plugin-azure-devops-backend@0.4.2-next.1 - - @backstage/plugin-azure-sites-backend@0.1.15-next.1 - - @backstage/plugin-code-coverage-backend@0.2.19-next.1 - @backstage/plugin-devtools-backend@0.2.2-next.1 - @backstage/plugin-entity-feedback-backend@0.2.2-next.1 - - @backstage/plugin-events-backend@0.2.14-next.1 - - @backstage/plugin-explore-backend@0.0.15-next.1 - - @backstage/plugin-graphql-backend@0.1.43-next.1 - - @backstage/plugin-jenkins-backend@0.2.8-next.1 - - @backstage/plugin-kafka-backend@0.3.2-next.1 - - @backstage/plugin-nomad-backend@0.1.7-next.1 - @backstage/plugin-permission-backend@0.5.28-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.2-next.1 - @backstage/plugin-permission-node@0.7.16-next.1 - @backstage/plugin-playlist-backend@0.3.9-next.1 - @backstage/plugin-proxy-backend@0.4.2-next.1 - - @backstage/plugin-rollbar-backend@0.1.50-next.1 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.6-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.22-next.1 - @backstage/plugin-search-backend@1.4.5-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.8-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.14-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.37-next.1 + - @backstage/plugin-sonarqube-backend@0.2.7-next.1 - @backstage/plugin-techdocs-backend@1.7.2-next.1 - - @backstage/config@1.1.0 - - @backstage/catalog-client@1.4.4 - - @backstage/catalog-model@1.4.2 - - @backstage/integration@1.7.1-next.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.1 - - @backstage/plugin-events-node@0.2.14-next.1 - @backstage/plugin-permission-common@0.7.8 - - @backstage/plugin-search-common@1.2.6 -## 0.2.88-next.0 +## 0.0.16-next.0 ### Patch Changes - Updated dependencies - - @backstage/plugin-search-backend-module-elasticsearch@1.3.8-next.0 - - @backstage/integration@1.7.1-next.0 + - @backstage/plugin-sonarqube-backend@0.2.7-next.0 - @backstage/plugin-playlist-backend@0.3.9-next.0 - - @backstage/plugin-rollbar-backend@0.1.50-next.0 - @backstage/plugin-catalog-backend@1.14.0-next.0 - - @backstage/plugin-tech-insights-backend@0.5.19-next.0 - - @backstage/plugin-code-coverage-backend@0.2.19-next.0 - @backstage/plugin-auth-node@0.3.2-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.22-next.0 - - @backstage/backend-common@0.19.7-next.0 - - example-app@0.2.88-next.0 - @backstage/plugin-adr-backend@0.4.2-next.0 - @backstage/plugin-scaffolder-backend@1.17.3-next.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.6-next.0 - @backstage/plugin-techdocs-backend@1.7.2-next.0 - @backstage/plugin-todo-backend@0.3.3-next.0 - - @backstage/config@1.1.0 + - @backstage/backend-defaults@0.2.5-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 - @backstage/backend-tasks@0.5.10-next.0 - - @backstage/catalog-client@1.4.4 - - @backstage/catalog-model@1.4.2 - @backstage/plugin-app-backend@0.3.53-next.0 - - @backstage/plugin-auth-backend@0.19.2-next.0 - @backstage/plugin-azure-devops-backend@0.4.2-next.0 - - @backstage/plugin-azure-sites-backend@0.1.15-next.0 - @backstage/plugin-badges-backend@0.3.2-next.0 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.0 - - @backstage/plugin-catalog-node@1.4.6-next.0 - @backstage/plugin-devtools-backend@0.2.2-next.0 - @backstage/plugin-entity-feedback-backend@0.2.2-next.0 - - @backstage/plugin-events-backend@0.2.14-next.0 - - @backstage/plugin-events-node@0.2.14-next.0 - - @backstage/plugin-explore-backend@0.0.15-next.0 - - @backstage/plugin-graphql-backend@0.1.43-next.0 - - @backstage/plugin-jenkins-backend@0.2.8-next.0 - - @backstage/plugin-kafka-backend@0.3.2-next.0 - @backstage/plugin-kubernetes-backend@0.12.2-next.0 - @backstage/plugin-lighthouse-backend@0.3.2-next.0 - @backstage/plugin-linguist-backend@0.5.2-next.0 - - @backstage/plugin-nomad-backend@0.1.7-next.0 - @backstage/plugin-permission-backend@0.5.28-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.2-next.0 - @backstage/plugin-permission-common@0.7.8 - @backstage/plugin-permission-node@0.7.16-next.0 - @backstage/plugin-proxy-backend@0.4.2-next.0 - @backstage/plugin-search-backend@1.4.5-next.0 - @backstage/plugin-search-backend-module-catalog@0.1.9-next.0 - @backstage/plugin-search-backend-module-explore@0.1.9-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.14-next.0 - @backstage/plugin-search-backend-module-techdocs@0.1.9-next.0 - @backstage/plugin-search-backend-node@1.2.9-next.0 - - @backstage/plugin-search-common@1.2.6 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.37-next.0 - - @backstage/plugin-tech-insights-node@0.4.11-next.0 -## 0.2.87 +## 0.0.15 ### Patch Changes - Updated dependencies - - @backstage/plugin-search-backend-module-pg@0.5.12 - @backstage/plugin-catalog-backend@1.13.0 - @backstage/plugin-kubernetes-backend@0.12.0 - @backstage/plugin-techdocs-backend@1.7.0 - - @backstage/plugin-auth-backend@0.19.0 - @backstage/plugin-proxy-backend@0.4.0 - @backstage/plugin-adr-backend@0.4.0 - @backstage/plugin-azure-devops-backend@0.4.0 @@ -1942,49 +1437,27 @@ - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0 - @backstage/plugin-devtools-backend@0.2.0 - @backstage/plugin-entity-feedback-backend@0.2.0 - - @backstage/plugin-kafka-backend@0.3.0 - @backstage/plugin-lighthouse-backend@0.3.0 - @backstage/plugin-linguist-backend@0.5.0 - @backstage/plugin-todo-backend@0.3.0 - @backstage/plugin-app-backend@0.3.51 - - @backstage/plugin-events-backend@0.2.12 - @backstage/plugin-permission-backend@0.5.26 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0 - @backstage/plugin-scaffolder-backend@1.17.0 - @backstage/plugin-search-backend@1.4.3 - @backstage/plugin-search-backend-module-catalog@0.1.7 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.6 - @backstage/plugin-search-backend-module-explore@0.1.7 - @backstage/plugin-search-backend-module-techdocs@0.1.7 - - @backstage/plugin-code-coverage-backend@0.2.17 - @backstage/backend-tasks@0.5.8 - - @backstage/backend-common@0.19.5 - @backstage/plugin-auth-node@0.3.0 - - @backstage/config@1.1.0 - - @backstage/catalog-client@1.4.4 - - @backstage/catalog-model@1.4.2 - - @backstage/integration@1.7.0 - @backstage/plugin-permission-common@0.7.8 - - @backstage/plugin-search-common@1.2.6 - @backstage/plugin-permission-node@0.7.14 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35 + - @backstage/backend-plugin-api@0.6.3 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0 - - @backstage/plugin-tech-insights-backend@0.5.17 - - example-app@0.2.87 - - @backstage/plugin-catalog-node@1.4.4 - - @backstage/plugin-playlist-backend@0.3.7 - - @backstage/plugin-rollbar-backend@0.1.48 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4 - - @backstage/plugin-azure-sites-backend@0.1.13 - - @backstage/plugin-events-node@0.2.12 - - @backstage/plugin-explore-backend@0.0.13 - - @backstage/plugin-graphql-backend@0.1.41 - - @backstage/plugin-jenkins-backend@0.2.6 - - @backstage/plugin-nomad-backend@0.1.5 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.20 + - @backstage/backend-defaults@0.2.3 - @backstage/plugin-search-backend-node@1.2.7 - - @backstage/plugin-tech-insights-node@0.4.9 -## 0.2.87-next.3 +## 0.0.15-next.3 ### Patch Changes @@ -1992,388 +1465,230 @@ - @backstage/plugin-techdocs-backend@1.7.0-next.3 - @backstage/plugin-proxy-backend@0.4.0-next.3 - @backstage/plugin-adr-backend@0.4.0-next.3 - - @backstage/plugin-auth-backend@0.19.0-next.3 - @backstage/plugin-azure-devops-backend@0.4.0-next.3 - @backstage/plugin-badges-backend@0.3.0-next.3 - @backstage/plugin-catalog-backend-module-unprocessed@0.3.0-next.3 - @backstage/plugin-devtools-backend@0.2.0-next.3 - @backstage/plugin-entity-feedback-backend@0.2.0-next.3 - - @backstage/plugin-kafka-backend@0.3.0-next.3 - @backstage/plugin-lighthouse-backend@0.3.0-next.3 - @backstage/plugin-linguist-backend@0.5.0-next.3 - @backstage/plugin-todo-backend@0.3.0-next.3 - @backstage/plugin-app-backend@0.3.51-next.3 - @backstage/plugin-catalog-backend@1.13.0-next.3 - - @backstage/plugin-events-backend@0.2.12-next.3 - @backstage/plugin-kubernetes-backend@0.11.6-next.3 - @backstage/plugin-permission-backend@0.5.26-next.3 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0-next.1 - @backstage/plugin-scaffolder-backend@1.17.0-next.3 - @backstage/plugin-search-backend@1.4.3-next.3 - @backstage/plugin-search-backend-module-catalog@0.1.7-next.3 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.6-next.3 - @backstage/plugin-search-backend-module-explore@0.1.7-next.3 - - @backstage/plugin-search-backend-module-pg@0.5.12-next.3 - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.3 - - @backstage/catalog-client@1.4.4-next.2 - - @backstage/catalog-model@1.4.2-next.2 - - @backstage/config@1.1.0-next.2 - - @backstage/integration@1.7.0-next.3 - @backstage/plugin-permission-common@0.7.8-next.2 - - @backstage/plugin-search-common@1.2.6-next.2 - @backstage/plugin-permission-node@0.7.14-next.3 + - @backstage/backend-plugin-api@0.6.3-next.3 - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.0-next.0 - - example-app@0.2.87-next.3 - - @backstage/backend-common@0.19.5-next.3 - - @backstage/plugin-explore-backend@0.0.13-next.3 + - @backstage/backend-defaults@0.2.3-next.3 - @backstage/backend-tasks@0.5.8-next.3 - @backstage/plugin-auth-node@0.3.0-next.3 - - @backstage/plugin-azure-sites-backend@0.1.13-next.3 - - @backstage/plugin-catalog-node@1.4.4-next.3 - - @backstage/plugin-code-coverage-backend@0.2.17-next.3 - - @backstage/plugin-events-node@0.2.12-next.3 - - @backstage/plugin-graphql-backend@0.1.41-next.3 - - @backstage/plugin-jenkins-backend@0.2.6-next.3 - - @backstage/plugin-nomad-backend@0.1.5-next.3 - - @backstage/plugin-playlist-backend@0.3.7-next.3 - - @backstage/plugin-rollbar-backend@0.1.48-next.3 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4-next.3 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.20-next.3 - @backstage/plugin-search-backend-node@1.2.7-next.3 - - @backstage/plugin-tech-insights-backend@0.5.17-next.3 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35-next.3 - - @backstage/plugin-tech-insights-node@0.4.9-next.3 -## 0.2.87-next.2 +## 0.0.15-next.2 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.16.6-next.2 - - @backstage/plugin-code-coverage-backend@0.2.17-next.2 - @backstage/plugin-permission-backend@0.5.26-next.2 - @backstage/plugin-catalog-backend@1.13.0-next.2 - @backstage/plugin-badges-backend@0.2.6-next.2 - - @backstage/config@1.1.0-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35-next.2 - - @backstage/plugin-tech-insights-backend@0.5.17-next.2 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.1.0-next.0 - @backstage/backend-tasks@0.5.8-next.2 - - example-app@0.2.87-next.2 - - @backstage/backend-common@0.19.5-next.2 + - @backstage/backend-defaults@0.2.3-next.2 - @backstage/plugin-app-backend@0.3.51-next.2 - - @backstage/plugin-auth-backend@0.18.9-next.2 - @backstage/plugin-auth-node@0.3.0-next.2 - - @backstage/plugin-catalog-node@1.4.4-next.2 - @backstage/plugin-entity-feedback-backend@0.1.9-next.2 - - @backstage/plugin-events-backend@0.2.12-next.2 - @backstage/plugin-kubernetes-backend@0.11.6-next.2 - @backstage/plugin-linguist-backend@0.4.3-next.2 - @backstage/plugin-permission-node@0.7.14-next.2 - - @backstage/plugin-playlist-backend@0.3.7-next.2 - @backstage/plugin-proxy-backend@0.3.3-next.2 - - @backstage/plugin-rollbar-backend@0.1.48-next.2 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4-next.2 - @backstage/plugin-search-backend@1.4.3-next.2 - @backstage/plugin-search-backend-module-catalog@0.1.7-next.2 - @backstage/plugin-search-backend-module-explore@0.1.7-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.12-next.2 - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.2 - @backstage/plugin-techdocs-backend@1.7.0-next.2 - - @backstage/integration@1.7.0-next.2 - @backstage/plugin-devtools-backend@0.1.6-next.2 - - @backstage/catalog-model@1.4.2-next.1 + - @backstage/backend-plugin-api@0.6.3-next.2 - @backstage/plugin-adr-backend@0.3.9-next.2 - @backstage/plugin-azure-devops-backend@0.3.30-next.2 - - @backstage/plugin-azure-sites-backend@0.1.13-next.2 - - @backstage/plugin-explore-backend@0.0.13-next.2 - - @backstage/plugin-graphql-backend@0.1.41-next.2 - - @backstage/plugin-jenkins-backend@0.2.6-next.2 - - @backstage/plugin-kafka-backend@0.2.44-next.2 - @backstage/plugin-lighthouse-backend@0.2.7-next.2 - - @backstage/plugin-nomad-backend@0.1.5-next.2 - @backstage/plugin-permission-common@0.7.8-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.20-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.6-next.2 - @backstage/plugin-search-backend-node@1.2.7-next.2 - - @backstage/plugin-tech-insights-node@0.4.9-next.2 - @backstage/plugin-todo-backend@0.2.3-next.2 - - @backstage/catalog-client@1.4.4-next.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.2.3-next.2 - - @backstage/plugin-events-node@0.2.12-next.2 - - @backstage/plugin-search-common@1.2.6-next.1 -## 0.2.87-next.1 +## 0.0.15-next.1 ### Patch Changes - Updated dependencies - - @backstage/plugin-search-backend-module-pg@0.5.12-next.1 - @backstage/plugin-kubernetes-backend@0.11.6-next.1 - @backstage/plugin-catalog-backend@1.13.0-next.1 - - @backstage/plugin-auth-backend@0.18.9-next.1 - - @backstage/config@1.1.0-next.0 - - @backstage/integration@1.7.0-next.1 - @backstage/plugin-devtools-backend@0.1.6-next.1 - @backstage/backend-tasks@0.5.8-next.1 - @backstage/plugin-techdocs-backend@1.7.0-next.1 - @backstage/plugin-scaffolder-backend@1.16.6-next.1 - - @backstage/plugin-code-coverage-backend@0.2.17-next.1 - - example-app@0.2.87-next.1 - - @backstage/backend-common@0.19.5-next.1 - - @backstage/catalog-model@1.4.2-next.0 + - @backstage/backend-plugin-api@0.6.3-next.1 - @backstage/plugin-adr-backend@0.3.9-next.1 - @backstage/plugin-app-backend@0.3.51-next.1 - @backstage/plugin-auth-node@0.3.0-next.1 - @backstage/plugin-azure-devops-backend@0.3.30-next.1 - - @backstage/plugin-azure-sites-backend@0.1.13-next.1 - @backstage/plugin-badges-backend@0.2.6-next.1 - @backstage/plugin-entity-feedback-backend@0.1.9-next.1 - - @backstage/plugin-events-backend@0.2.12-next.1 - - @backstage/plugin-explore-backend@0.0.13-next.1 - - @backstage/plugin-graphql-backend@0.1.41-next.1 - - @backstage/plugin-jenkins-backend@0.2.6-next.1 - - @backstage/plugin-kafka-backend@0.2.44-next.1 - @backstage/plugin-lighthouse-backend@0.2.7-next.1 - @backstage/plugin-linguist-backend@0.4.3-next.1 - - @backstage/plugin-nomad-backend@0.1.5-next.1 - @backstage/plugin-permission-backend@0.5.26-next.1 - @backstage/plugin-permission-common@0.7.8-next.0 - @backstage/plugin-permission-node@0.7.14-next.1 - - @backstage/plugin-playlist-backend@0.3.7-next.1 - @backstage/plugin-proxy-backend@0.3.3-next.1 - - @backstage/plugin-rollbar-backend@0.1.48-next.1 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.4-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.20-next.1 - @backstage/plugin-search-backend@1.4.3-next.1 - @backstage/plugin-search-backend-module-catalog@0.1.7-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.6-next.1 - @backstage/plugin-search-backend-module-explore@0.1.7-next.1 - @backstage/plugin-search-backend-module-techdocs@0.1.7-next.1 - @backstage/plugin-search-backend-node@1.2.7-next.1 - - @backstage/plugin-tech-insights-backend@0.5.17-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.35-next.1 - - @backstage/plugin-tech-insights-node@0.4.9-next.1 - @backstage/plugin-todo-backend@0.2.3-next.1 - - @backstage/plugin-catalog-node@1.4.4-next.1 + - @backstage/backend-defaults@0.2.3-next.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.2.3-next.1 - - @backstage/plugin-events-node@0.2.12-next.1 - - @backstage/catalog-client@1.4.4-next.0 - - @backstage/plugin-search-common@1.2.6-next.0 -## 0.2.87-next.0 +## 0.0.15-next.0 ### Patch Changes - Updated dependencies - @backstage/plugin-catalog-backend@1.12.2-next.0 - - @backstage/plugin-auth-backend@0.18.8-next.0 - - @backstage/plugin-code-coverage-backend@0.2.16-next.0 - @backstage/plugin-scaffolder-backend@1.16.3-next.0 - @backstage/plugin-auth-node@0.3.0-next.0 - - @backstage/backend-common@0.19.4-next.0 - @backstage/plugin-linguist-backend@0.4.2-next.0 - - @backstage/integration@1.7.0-next.0 - @backstage/plugin-entity-feedback-backend@0.1.8-next.0 - - @backstage/plugin-tech-insights-backend@0.5.16-next.0 - @backstage/backend-tasks@0.5.7-next.0 - @backstage/plugin-app-backend@0.3.50-next.0 - - example-app@0.2.87-next.0 - - @backstage/catalog-client@1.4.3 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 + - @backstage/backend-defaults@0.2.2-next.0 + - @backstage/backend-plugin-api@0.6.2-next.0 - @backstage/plugin-adr-backend@0.3.8-next.0 - @backstage/plugin-azure-devops-backend@0.3.29-next.0 - - @backstage/plugin-azure-sites-backend@0.1.12-next.0 - @backstage/plugin-badges-backend@0.2.5-next.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.2.2-next.0 - - @backstage/plugin-catalog-node@1.4.3-next.0 - @backstage/plugin-devtools-backend@0.1.5-next.0 - - @backstage/plugin-events-backend@0.2.11-next.0 - - @backstage/plugin-events-node@0.2.11-next.0 - - @backstage/plugin-explore-backend@0.0.12-next.0 - - @backstage/plugin-graphql-backend@0.1.40-next.0 - - @backstage/plugin-jenkins-backend@0.2.5-next.0 - - @backstage/plugin-kafka-backend@0.2.43-next.0 - @backstage/plugin-kubernetes-backend@0.11.5-next.0 - @backstage/plugin-lighthouse-backend@0.2.6-next.0 - - @backstage/plugin-nomad-backend@0.1.4-next.0 - @backstage/plugin-permission-backend@0.5.25-next.0 - @backstage/plugin-permission-common@0.7.7 - @backstage/plugin-permission-node@0.7.13-next.0 - - @backstage/plugin-playlist-backend@0.3.6-next.0 - @backstage/plugin-proxy-backend@0.3.2-next.0 - - @backstage/plugin-rollbar-backend@0.1.47-next.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.3-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.19-next.0 - @backstage/plugin-search-backend@1.4.2-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.5-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.11-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.6-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.6-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.6-next.0 - @backstage/plugin-search-backend-node@1.2.6-next.0 - - @backstage/plugin-search-common@1.2.5 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.34-next.0 - - @backstage/plugin-tech-insights-node@0.4.8-next.0 - @backstage/plugin-techdocs-backend@1.6.7-next.0 - @backstage/plugin-todo-backend@0.2.2-next.0 -## 0.2.86 +## 0.0.14 ### Patch Changes - Updated dependencies - - @backstage/plugin-search-backend-module-elasticsearch@1.3.3 - - @backstage/plugin-search-backend-module-pg@0.5.9 + - @backstage/plugin-search-backend-module-techdocs@0.1.4 + - @backstage/plugin-search-backend-module-catalog@0.1.4 + - @backstage/plugin-search-backend-module-explore@0.1.4 - @backstage/plugin-azure-devops-backend@0.3.27 - @backstage/plugin-kubernetes-backend@0.11.3 - @backstage/plugin-lighthouse-backend@0.2.4 - @backstage/plugin-permission-backend@0.5.23 - @backstage/plugin-scaffolder-backend@1.16.0 + - @backstage/backend-defaults@0.2.0 - @backstage/plugin-devtools-backend@0.1.3 - @backstage/plugin-techdocs-backend@1.6.5 - - @backstage/backend-common@0.19.2 - @backstage/plugin-catalog-backend@1.12.0 - @backstage/plugin-badges-backend@0.2.3 - - @backstage/plugin-events-backend@0.2.9 - @backstage/plugin-search-backend@1.4.0 - - @backstage/plugin-kafka-backend@0.2.41 - @backstage/plugin-proxy-backend@0.3.0 - @backstage/plugin-todo-backend@0.2.0 - @backstage/plugin-app-backend@0.3.48 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.1 - - @backstage/plugin-auth-backend@0.18.6 - - @backstage/plugin-explore-backend@0.0.10 + - @backstage/backend-plugin-api@0.6.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.17 - @backstage/plugin-entity-feedback-backend@0.1.6 - - @backstage/plugin-code-coverage-backend@0.2.14 - @backstage/plugin-search-backend-node@1.2.4 - @backstage/plugin-linguist-backend@0.4.0 - - @backstage/plugin-playlist-backend@0.3.4 - - @backstage/plugin-jenkins-backend@0.2.3 - - @backstage/plugin-nomad-backend@0.1.2 - - @backstage/plugin-catalog-node@1.4.1 - - @backstage/plugin-events-node@0.2.9 - @backstage/plugin-auth-node@0.2.17 - - @backstage/integration@1.6.0 - @backstage/backend-tasks@0.5.5 - - example-app@0.2.86 - @backstage/plugin-adr-backend@0.3.6 - - @backstage/plugin-azure-sites-backend@0.1.10 - - @backstage/plugin-graphql-backend@0.1.38 - @backstage/plugin-permission-node@0.7.11 - - @backstage/plugin-rollbar-backend@0.1.45 - - @backstage/plugin-tech-insights-backend@0.5.14 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.32 - - @backstage/plugin-tech-insights-node@0.4.6 - - @backstage/catalog-client@1.4.3 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - @backstage/plugin-permission-common@0.7.7 - - @backstage/plugin-search-common@1.2.5 -## 0.2.86-next.2 +## 0.0.14-next.2 ### Patch Changes - Updated dependencies - - @backstage/plugin-auth-backend@0.18.6-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.4-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.4-next.2 - @backstage/plugin-scaffolder-backend@1.15.2-next.2 - - @backstage/plugin-explore-backend@0.0.10-next.2 - @backstage/plugin-catalog-backend@1.12.0-next.2 + - @backstage/backend-plugin-api@0.6.0-next.2 - @backstage/plugin-proxy-backend@0.3.0-next.2 - @backstage/backend-tasks@0.5.5-next.2 - @backstage/plugin-app-backend@0.3.48-next.2 - @backstage/plugin-linguist-backend@0.4.0-next.2 - @backstage/plugin-techdocs-backend@1.6.5-next.2 - - @backstage/backend-common@0.19.2-next.2 - - example-app@0.2.86-next.2 + - @backstage/backend-defaults@0.2.0-next.2 - @backstage/plugin-adr-backend@0.3.6-next.2 - @backstage/plugin-azure-devops-backend@0.3.27-next.2 - @backstage/plugin-badges-backend@0.2.3-next.2 - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.2 - - @backstage/plugin-catalog-node@1.4.1-next.2 - @backstage/plugin-devtools-backend@0.1.3-next.2 - @backstage/plugin-entity-feedback-backend@0.1.6-next.2 - - @backstage/plugin-events-backend@0.2.9-next.2 - - @backstage/plugin-events-node@0.2.9-next.2 - - @backstage/plugin-kafka-backend@0.2.41-next.2 - @backstage/plugin-kubernetes-backend@0.11.3-next.2 - @backstage/plugin-lighthouse-backend@0.2.4-next.2 - @backstage/plugin-permission-backend@0.5.23-next.2 - @backstage/plugin-permission-node@0.7.11-next.2 - @backstage/plugin-search-backend@1.4.0-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.3-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.9-next.2 - @backstage/plugin-search-backend-node@1.2.4-next.2 - @backstage/plugin-todo-backend@0.2.0-next.2 - - @backstage/plugin-tech-insights-backend@0.5.14-next.2 - - @backstage/plugin-tech-insights-node@0.4.6-next.2 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.1-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.17-next.2 - @backstage/plugin-auth-node@0.2.17-next.2 - - @backstage/plugin-azure-sites-backend@0.1.10-next.2 - - @backstage/plugin-code-coverage-backend@0.2.14-next.2 - - @backstage/plugin-graphql-backend@0.1.38-next.2 - - @backstage/plugin-jenkins-backend@0.2.3-next.2 - - @backstage/plugin-nomad-backend@0.1.2-next.2 - - @backstage/plugin-playlist-backend@0.3.4-next.2 - - @backstage/plugin-rollbar-backend@0.1.45-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.32-next.2 -## 0.2.86-next.1 +## 0.0.14-next.1 ### Patch Changes - Updated dependencies - - @backstage/plugin-search-backend-module-elasticsearch@1.3.3-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.9-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.4-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.4-next.1 - @backstage/plugin-azure-devops-backend@0.3.27-next.1 - @backstage/plugin-kubernetes-backend@0.11.3-next.1 - @backstage/plugin-lighthouse-backend@0.2.4-next.1 - @backstage/plugin-permission-backend@0.5.23-next.1 - @backstage/plugin-scaffolder-backend@1.15.2-next.1 + - @backstage/backend-defaults@0.2.0-next.1 - @backstage/plugin-devtools-backend@0.1.3-next.1 - @backstage/plugin-techdocs-backend@1.6.5-next.1 - - @backstage/backend-common@0.19.2-next.1 - @backstage/plugin-catalog-backend@1.12.0-next.1 - @backstage/plugin-badges-backend@0.2.3-next.1 - - @backstage/plugin-events-backend@0.2.9-next.1 - @backstage/plugin-search-backend@1.4.0-next.1 - - @backstage/plugin-kafka-backend@0.2.41-next.1 - - @backstage/plugin-proxy-backend@0.2.42-next.1 - @backstage/plugin-todo-backend@0.2.0-next.1 - @backstage/plugin-app-backend@0.3.48-next.1 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.1-next.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.17-next.1 - @backstage/plugin-entity-feedback-backend@0.1.6-next.1 - - @backstage/plugin-code-coverage-backend@0.2.14-next.1 - @backstage/plugin-search-backend-node@1.2.4-next.1 - @backstage/plugin-linguist-backend@0.3.2-next.1 - - @backstage/plugin-playlist-backend@0.3.4-next.1 - - @backstage/plugin-explore-backend@0.0.10-next.1 - - @backstage/plugin-jenkins-backend@0.2.3-next.1 - - @backstage/plugin-nomad-backend@0.1.2-next.1 - - @backstage/plugin-catalog-node@1.4.1-next.1 - - @backstage/plugin-events-node@0.2.9-next.1 - @backstage/plugin-auth-node@0.2.17-next.1 - - @backstage/plugin-auth-backend@0.18.6-next.1 - @backstage/backend-tasks@0.5.5-next.1 - @backstage/plugin-adr-backend@0.3.6-next.1 - - @backstage/plugin-azure-sites-backend@0.1.10-next.1 - - @backstage/plugin-graphql-backend@0.1.38-next.1 - @backstage/plugin-permission-node@0.7.11-next.1 - - @backstage/plugin-rollbar-backend@0.1.45-next.1 - - @backstage/plugin-tech-insights-backend@0.5.14-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.32-next.1 - - @backstage/plugin-tech-insights-node@0.4.6-next.1 - - example-app@0.2.86-next.1 - - @backstage/integration@1.5.1 - - @backstage/catalog-client@1.4.3 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - @backstage/plugin-permission-common@0.7.7 - - @backstage/plugin-search-common@1.2.5 -## 0.2.86-next.0 +## 0.0.14-next.0 ### Patch Changes @@ -2384,61 +1699,34 @@ - @backstage/plugin-todo-backend@0.2.0-next.0 - @backstage/plugin-catalog-backend@1.12.0-next.0 - @backstage/plugin-search-backend@1.4.0-next.0 - - example-app@0.2.86-next.0 - - @backstage/backend-common@0.19.2-next.0 + - @backstage/backend-defaults@0.1.13-next.0 - @backstage/backend-tasks@0.5.5-next.0 - - @backstage/catalog-client@1.4.3 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - - @backstage/integration@1.5.1 - @backstage/plugin-adr-backend@0.3.6-next.0 - @backstage/plugin-app-backend@0.3.48-next.0 - - @backstage/plugin-auth-backend@0.18.6-next.0 - @backstage/plugin-auth-node@0.2.17-next.0 - @backstage/plugin-azure-devops-backend@0.3.27-next.0 - - @backstage/plugin-azure-sites-backend@0.1.10-next.0 - @backstage/plugin-badges-backend@0.2.3-next.0 - - @backstage/plugin-catalog-node@1.4.1-next.0 - - @backstage/plugin-code-coverage-backend@0.2.14-next.0 - @backstage/plugin-devtools-backend@0.1.3-next.0 - @backstage/plugin-entity-feedback-backend@0.1.6-next.0 - - @backstage/plugin-events-backend@0.2.9-next.0 - - @backstage/plugin-events-node@0.2.9-next.0 - - @backstage/plugin-explore-backend@0.0.10-next.0 - - @backstage/plugin-graphql-backend@0.1.38-next.0 - - @backstage/plugin-jenkins-backend@0.2.3-next.0 - - @backstage/plugin-kafka-backend@0.2.41-next.0 - @backstage/plugin-kubernetes-backend@0.11.3-next.0 - @backstage/plugin-lighthouse-backend@0.2.4-next.0 - - @backstage/plugin-nomad-backend@0.1.2-next.0 - @backstage/plugin-permission-backend@0.5.23-next.0 - @backstage/plugin-permission-common@0.7.7 - @backstage/plugin-permission-node@0.7.11-next.0 - - @backstage/plugin-playlist-backend@0.3.4-next.0 - - @backstage/plugin-proxy-backend@0.2.42-next.0 - - @backstage/plugin-rollbar-backend@0.1.45-next.0 - @backstage/plugin-scaffolder-backend@1.15.2-next.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.1-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.17-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.3-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.9-next.0 - - @backstage/plugin-search-common@1.2.5 - - @backstage/plugin-tech-insights-backend@0.5.14-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.32-next.0 - - @backstage/plugin-tech-insights-node@0.4.6-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.4-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.4-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.0 - @backstage/plugin-techdocs-backend@1.6.5-next.0 -## 0.2.85 +## 0.0.13 ### Patch Changes - Updated dependencies - @backstage/plugin-kubernetes-backend@0.11.2 - @backstage/plugin-badges-backend@0.2.2 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.0 - @backstage/plugin-devtools-backend@0.1.2 - - @backstage/plugin-tech-insights-backend@0.5.13 - - @backstage/backend-common@0.19.1 - @backstage/plugin-scaffolder-backend@1.15.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1 - @backstage/plugin-azure-devops-backend@0.3.26 @@ -2447,98 +1735,52 @@ - @backstage/plugin-lighthouse-backend@0.2.3 - @backstage/plugin-entity-feedback-backend@0.1.5 - @backstage/plugin-catalog-backend@1.11.0 - - @backstage/plugin-catalog-node@1.4.0 - - @backstage/plugin-auth-backend@0.18.5 - - example-app@0.2.85 + - @backstage/backend-defaults@0.1.12 - @backstage/backend-tasks@0.5.4 - - @backstage/catalog-client@1.4.3 - - @backstage/catalog-model@1.4.1 - - @backstage/config@1.0.8 - - @backstage/integration@1.5.1 - @backstage/plugin-app-backend@0.3.47 - @backstage/plugin-auth-node@0.2.16 - - @backstage/plugin-azure-sites-backend@0.1.9 - - @backstage/plugin-code-coverage-backend@0.2.13 - - @backstage/plugin-events-backend@0.2.8 - - @backstage/plugin-events-node@0.2.8 - - @backstage/plugin-explore-backend@0.0.9 - - @backstage/plugin-graphql-backend@0.1.37 - - @backstage/plugin-jenkins-backend@0.2.2 - - @backstage/plugin-kafka-backend@0.2.40 - - @backstage/plugin-nomad-backend@0.1.1 - @backstage/plugin-permission-backend@0.5.22 - @backstage/plugin-permission-common@0.7.7 - @backstage/plugin-permission-node@0.7.10 - - @backstage/plugin-playlist-backend@0.3.3 - - @backstage/plugin-proxy-backend@0.2.41 - - @backstage/plugin-rollbar-backend@0.1.44 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.16 - @backstage/plugin-search-backend@1.3.3 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.2 - - @backstage/plugin-search-backend-module-pg@0.5.8 + - @backstage/plugin-search-backend-module-catalog@0.1.3 + - @backstage/plugin-search-backend-module-explore@0.1.3 + - @backstage/plugin-search-backend-module-techdocs@0.1.3 - @backstage/plugin-search-backend-node@1.2.3 - - @backstage/plugin-search-common@1.2.5 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.31 - - @backstage/plugin-tech-insights-node@0.4.5 - @backstage/plugin-techdocs-backend@1.6.4 - @backstage/plugin-todo-backend@0.1.44 -## 0.2.85-next.2 +## 0.0.13-next.2 ### Patch Changes - Updated dependencies - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.0-next.1 - @backstage/plugin-devtools-backend@0.1.2-next.2 - - @backstage/plugin-tech-insights-backend@0.5.13-next.1 - @backstage/plugin-scaffolder-backend@1.15.1-next.1 - @backstage/plugin-kubernetes-backend@0.11.2-next.2 - @backstage/plugin-adr-backend@0.3.5-next.1 - - example-app@0.2.85-next.2 - - @backstage/backend-common@0.19.1-next.0 + - @backstage/backend-defaults@0.1.12-next.0 - @backstage/backend-tasks@0.5.4-next.0 - - @backstage/catalog-client@1.4.3-next.0 - - @backstage/catalog-model@1.4.1-next.0 - - @backstage/config@1.0.8 - - @backstage/integration@1.5.1-next.0 - @backstage/plugin-app-backend@0.3.47-next.0 - - @backstage/plugin-auth-backend@0.18.5-next.1 - @backstage/plugin-auth-node@0.2.16-next.0 - @backstage/plugin-azure-devops-backend@0.3.26-next.1 - - @backstage/plugin-azure-sites-backend@0.1.9-next.0 - @backstage/plugin-badges-backend@0.2.2-next.1 - @backstage/plugin-catalog-backend@1.11.0-next.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1-next.0 - - @backstage/plugin-catalog-node@1.4.0-next.0 - - @backstage/plugin-code-coverage-backend@0.2.13-next.0 - @backstage/plugin-entity-feedback-backend@0.1.5-next.0 - - @backstage/plugin-events-backend@0.2.8-next.0 - - @backstage/plugin-events-node@0.2.8-next.0 - - @backstage/plugin-explore-backend@0.0.9-next.0 - - @backstage/plugin-graphql-backend@0.1.37-next.0 - - @backstage/plugin-jenkins-backend@0.2.2-next.0 - - @backstage/plugin-kafka-backend@0.2.40-next.0 - - @backstage/plugin-lighthouse-backend@0.2.3-next.0 - @backstage/plugin-linguist-backend@0.3.1-next.1 - - @backstage/plugin-nomad-backend@0.1.1-next.0 - @backstage/plugin-permission-backend@0.5.22-next.0 - @backstage/plugin-permission-common@0.7.7-next.0 - @backstage/plugin-permission-node@0.7.10-next.0 - - @backstage/plugin-playlist-backend@0.3.3-next.0 - - @backstage/plugin-proxy-backend@0.2.41-next.0 - - @backstage/plugin-rollbar-backend@0.1.44-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.16-next.1 - @backstage/plugin-search-backend@1.3.3-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.2-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.8-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.3-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.3-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.3-next.0 - @backstage/plugin-search-backend-node@1.2.3-next.0 - - @backstage/plugin-search-common@1.2.5-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.31-next.0 - - @backstage/plugin-tech-insights-node@0.4.5-next.0 - @backstage/plugin-techdocs-backend@1.6.4-next.0 - @backstage/plugin-todo-backend@0.1.44-next.0 -## 0.2.85-next.1 +## 0.0.13-next.1 ### Patch Changes @@ -2548,4340 +1790,611 @@ - @backstage/plugin-azure-devops-backend@0.3.26-next.1 - @backstage/plugin-devtools-backend@0.1.2-next.1 - @backstage/plugin-linguist-backend@0.3.1-next.1 - - @backstage/plugin-auth-backend@0.18.5-next.1 - - example-app@0.2.85-next.1 - - @backstage/config@1.0.8 -## 0.2.85-next.0 +## 0.0.13-next.0 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.19.1-next.0 - @backstage/plugin-catalog-backend-module-unprocessed@0.1.1-next.0 - @backstage/plugin-entity-feedback-backend@0.1.5-next.0 - @backstage/plugin-catalog-backend@1.11.0-next.0 - - @backstage/plugin-catalog-node@1.4.0-next.0 - @backstage/plugin-kubernetes-backend@0.11.2-next.0 - - example-app@0.2.85-next.0 - - @backstage/backend-tasks@0.5.4-next.0 - - @backstage/catalog-client@1.4.3-next.0 - - @backstage/catalog-model@1.4.1-next.0 - - @backstage/config@1.0.8 - - @backstage/integration@1.5.1-next.0 - - @backstage/plugin-adr-backend@0.3.5-next.0 + - @backstage/backend-defaults@0.1.12-next.0 - @backstage/plugin-app-backend@0.3.47-next.0 - - @backstage/plugin-auth-backend@0.18.5-next.0 - @backstage/plugin-auth-node@0.2.16-next.0 - - @backstage/plugin-azure-devops-backend@0.3.26-next.0 - - @backstage/plugin-azure-sites-backend@0.1.9-next.0 - - @backstage/plugin-badges-backend@0.2.2-next.0 - - @backstage/plugin-code-coverage-backend@0.2.13-next.0 - - @backstage/plugin-devtools-backend@0.1.2-next.0 - - @backstage/plugin-events-backend@0.2.8-next.0 - - @backstage/plugin-events-node@0.2.8-next.0 - - @backstage/plugin-explore-backend@0.0.9-next.0 - - @backstage/plugin-graphql-backend@0.1.37-next.0 - - @backstage/plugin-jenkins-backend@0.2.2-next.0 - - @backstage/plugin-kafka-backend@0.2.40-next.0 - - @backstage/plugin-lighthouse-backend@0.2.3-next.0 - - @backstage/plugin-linguist-backend@0.3.1-next.0 - - @backstage/plugin-nomad-backend@0.1.1-next.0 - @backstage/plugin-permission-backend@0.5.22-next.0 - @backstage/plugin-permission-common@0.7.7-next.0 - @backstage/plugin-permission-node@0.7.10-next.0 - - @backstage/plugin-playlist-backend@0.3.3-next.0 - - @backstage/plugin-proxy-backend@0.2.41-next.0 - - @backstage/plugin-rollbar-backend@0.1.44-next.0 - @backstage/plugin-scaffolder-backend@1.15.1-next.0 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.4-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.16-next.0 - @backstage/plugin-search-backend@1.3.3-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.2-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.8-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.3-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.3-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.3-next.0 - @backstage/plugin-search-backend-node@1.2.3-next.0 - - @backstage/plugin-search-common@1.2.5-next.0 - - @backstage/plugin-tech-insights-backend@0.5.13-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.31-next.0 - - @backstage/plugin-tech-insights-node@0.4.5-next.0 - @backstage/plugin-techdocs-backend@1.6.4-next.0 - @backstage/plugin-todo-backend@0.1.44-next.0 -## 0.2.84 +## 0.0.12 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.19.0 - - @backstage/catalog-client@1.4.2 - - @backstage/plugin-jenkins-backend@0.2.1 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.3 - - @backstage/plugin-devtools-backend@0.1.1 - @backstage/plugin-scaffolder-backend@1.15.0 - - @backstage/plugin-nomad-backend@0.1.0 - - @backstage/plugin-azure-sites-backend@0.1.8 - @backstage/plugin-kubernetes-backend@0.11.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0 - - @backstage/plugin-badges-backend@0.2.1 - @backstage/plugin-catalog-backend@1.10.0 - - @backstage/integration@1.5.0 - @backstage/plugin-search-backend@1.3.2 - - @backstage/plugin-explore-backend@0.0.8 - - @backstage/catalog-model@1.4.0 - - @backstage/plugin-auth-backend@0.18.4 - - @backstage/plugin-adr-backend@0.3.4 - - @backstage/plugin-code-coverage-backend@0.2.12 - - @backstage/plugin-proxy-backend@0.2.40 - - @backstage/plugin-linguist-backend@0.3.0 - - @backstage/plugin-search-backend-module-pg@0.5.7 - - example-app@0.2.84 - - @backstage/backend-tasks@0.5.3 + - @backstage/plugin-search-backend-module-explore@0.1.2 + - @backstage/backend-defaults@0.1.11 - @backstage/plugin-app-backend@0.3.46 - @backstage/plugin-auth-node@0.2.15 - - @backstage/plugin-azure-devops-backend@0.3.25 - - @backstage/plugin-catalog-node@1.3.7 - - @backstage/plugin-entity-feedback-backend@0.1.4 - - @backstage/plugin-events-backend@0.2.7 - - @backstage/plugin-graphql-backend@0.1.36 - - @backstage/plugin-kafka-backend@0.2.39 - - @backstage/plugin-lighthouse-backend@0.2.2 - @backstage/plugin-permission-backend@0.5.21 - @backstage/plugin-permission-node@0.7.9 - - @backstage/plugin-playlist-backend@0.3.2 - - @backstage/plugin-rollbar-backend@0.1.43 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.15 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.1 + - @backstage/plugin-search-backend-module-catalog@0.1.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.2 - @backstage/plugin-search-backend-node@1.2.2 - - @backstage/plugin-tech-insights-backend@0.5.12 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.30 - - @backstage/plugin-tech-insights-node@0.4.4 - @backstage/plugin-techdocs-backend@1.6.3 - @backstage/plugin-todo-backend@0.1.43 - - @backstage/config@1.0.8 - - @backstage/plugin-events-node@0.2.7 - @backstage/plugin-permission-common@0.7.6 - - @backstage/plugin-search-common@1.2.4 -## 0.2.84-next.3 +## 0.0.12-next.3 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.15.0-next.3 - @backstage/plugin-kubernetes-backend@0.11.1-next.3 - - @backstage/backend-common@0.19.0-next.2 - - @backstage/catalog-model@1.4.0-next.1 - @backstage/plugin-catalog-backend@1.10.0-next.2 - - example-app@0.2.84-next.3 - - @backstage/backend-tasks@0.5.3-next.2 - - @backstage/catalog-client@1.4.2-next.2 - - @backstage/config@1.0.7 - - @backstage/integration@1.5.0-next.0 - - @backstage/plugin-adr-backend@0.3.4-next.2 + - @backstage/backend-defaults@0.1.11-next.2 - @backstage/plugin-app-backend@0.3.46-next.2 - - @backstage/plugin-auth-backend@0.18.4-next.3 - @backstage/plugin-auth-node@0.2.15-next.2 - - @backstage/plugin-azure-devops-backend@0.3.25-next.2 - - @backstage/plugin-azure-sites-backend@0.1.8-next.2 - - @backstage/plugin-badges-backend@0.2.1-next.3 - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.1 - - @backstage/plugin-catalog-node@1.3.7-next.2 - - @backstage/plugin-code-coverage-backend@0.2.12-next.3 - - @backstage/plugin-devtools-backend@0.1.1-next.2 - - @backstage/plugin-entity-feedback-backend@0.1.4-next.2 - - @backstage/plugin-events-backend@0.2.7-next.2 - - @backstage/plugin-events-node@0.2.7-next.2 - - @backstage/plugin-explore-backend@0.0.8-next.2 - - @backstage/plugin-graphql-backend@0.1.36-next.2 - - @backstage/plugin-jenkins-backend@0.2.1-next.2 - - @backstage/plugin-kafka-backend@0.2.39-next.2 - - @backstage/plugin-lighthouse-backend@0.2.2-next.2 - - @backstage/plugin-linguist-backend@0.3.0-next.2 - @backstage/plugin-permission-backend@0.5.21-next.2 - @backstage/plugin-permission-common@0.7.6-next.0 - @backstage/plugin-permission-node@0.7.9-next.2 - - @backstage/plugin-playlist-backend@0.3.2-next.2 - - @backstage/plugin-proxy-backend@0.2.40-next.2 - - @backstage/plugin-rollbar-backend@0.1.43-next.2 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.3-next.3 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.15-next.3 - @backstage/plugin-search-backend@1.3.2-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.1-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.7-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.2-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.2-next.2 + - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.2 - @backstage/plugin-search-backend-node@1.2.2-next.2 - - @backstage/plugin-search-common@1.2.4-next.0 - - @backstage/plugin-tech-insights-backend@0.5.12-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.30-next.2 - - @backstage/plugin-tech-insights-node@0.4.4-next.2 - @backstage/plugin-techdocs-backend@1.6.3-next.2 - @backstage/plugin-todo-backend@0.1.43-next.2 -## 0.2.84-next.2 +## 0.0.12-next.2 ### Patch Changes - Updated dependencies - @backstage/plugin-kubernetes-backend@0.11.1-next.2 - - @backstage/plugin-badges-backend@0.2.1-next.2 - @backstage/plugin-scaffolder-backend@1.15.0-next.2 - - @backstage/plugin-auth-backend@0.18.4-next.2 - - @backstage/plugin-code-coverage-backend@0.2.12-next.2 - - example-app@0.2.84-next.2 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.3-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.15-next.2 - - @backstage/config@1.0.7 -## 0.2.84-next.1 +## 0.0.12-next.1 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.19.0-next.1 - - @backstage/plugin-jenkins-backend@0.2.1-next.1 - - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.1.3-next.1 - - @backstage/plugin-devtools-backend@0.1.1-next.1 - @backstage/plugin-catalog-backend-module-unprocessed@0.1.0-next.0 - @backstage/plugin-catalog-backend@1.9.2-next.1 - - @backstage/integration@1.5.0-next.0 - - @backstage/plugin-adr-backend@0.3.4-next.1 - - @backstage/plugin-proxy-backend@0.2.40-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.7-next.1 - - @backstage/catalog-model@1.4.0-next.0 - @backstage/plugin-scaffolder-backend@1.15.0-next.1 - - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/backend-defaults@0.1.11-next.1 - @backstage/plugin-app-backend@0.3.46-next.1 - - @backstage/plugin-auth-backend@0.18.4-next.1 - @backstage/plugin-auth-node@0.2.15-next.1 - - @backstage/plugin-azure-devops-backend@0.3.25-next.1 - - @backstage/plugin-azure-sites-backend@0.1.8-next.1 - - @backstage/plugin-badges-backend@0.2.1-next.1 - - @backstage/plugin-catalog-node@1.3.7-next.1 - - @backstage/plugin-code-coverage-backend@0.2.12-next.1 - - @backstage/plugin-entity-feedback-backend@0.1.4-next.1 - - @backstage/plugin-events-backend@0.2.7-next.1 - - @backstage/plugin-explore-backend@0.0.8-next.1 - - @backstage/plugin-graphql-backend@0.1.36-next.1 - - @backstage/plugin-kafka-backend@0.2.39-next.1 - @backstage/plugin-kubernetes-backend@0.11.1-next.1 - - @backstage/plugin-lighthouse-backend@0.2.2-next.1 - - @backstage/plugin-linguist-backend@0.3.0-next.1 - @backstage/plugin-permission-backend@0.5.21-next.1 - @backstage/plugin-permission-node@0.7.9-next.1 - - @backstage/plugin-playlist-backend@0.3.2-next.1 - - @backstage/plugin-rollbar-backend@0.1.43-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.15-next.1 - @backstage/plugin-search-backend@1.3.2-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.1-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.2-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.2-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.1 - @backstage/plugin-search-backend-node@1.2.2-next.1 - - @backstage/plugin-tech-insights-backend@0.5.12-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.30-next.1 - - @backstage/plugin-tech-insights-node@0.4.4-next.1 - @backstage/plugin-techdocs-backend@1.6.3-next.1 - @backstage/plugin-todo-backend@0.1.43-next.1 - - example-app@0.2.84-next.1 - - @backstage/catalog-client@1.4.2-next.1 - @backstage/plugin-permission-common@0.7.6-next.0 - - @backstage/plugin-events-node@0.2.7-next.1 - - @backstage/config@1.0.7 - - @backstage/plugin-search-common@1.2.4-next.0 -## 0.2.84-next.0 +## 0.0.12-next.0 ### Patch Changes - Updated dependencies - - @backstage/catalog-client@1.4.2-next.0 - @backstage/plugin-scaffolder-backend@1.14.1-next.0 - - @backstage/plugin-jenkins-backend@0.2.1-next.0 - - @backstage/plugin-linguist-backend@0.3.0-next.0 - - @backstage/plugin-devtools-backend@0.1.1-next.0 - - @backstage/plugin-adr-backend@0.3.4-next.0 - - @backstage/plugin-auth-backend@0.18.4-next.0 - - @backstage/plugin-badges-backend@0.2.1-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.2-next.0 - @backstage/plugin-catalog-backend@1.9.2-next.0 - - @backstage/plugin-catalog-node@1.3.7-next.0 - - @backstage/plugin-code-coverage-backend@0.2.12-next.0 - - @backstage/plugin-entity-feedback-backend@0.1.4-next.0 - @backstage/plugin-kubernetes-backend@0.11.1-next.0 - - @backstage/plugin-lighthouse-backend@0.2.2-next.0 - - @backstage/plugin-playlist-backend@0.3.2-next.0 - - @backstage/plugin-tech-insights-backend@0.5.12-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.2-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.2-next.0 - @backstage/plugin-techdocs-backend@1.6.3-next.0 - @backstage/plugin-todo-backend@0.1.43-next.0 - - example-app@0.2.84-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.15-next.0 - - @backstage/backend-common@0.18.6-next.0 - - @backstage/integration@1.4.5 - @backstage/plugin-app-backend@0.3.46-next.0 - - @backstage/plugin-explore-backend@0.0.8-next.0 - - @backstage/config@1.0.7 - - @backstage/backend-tasks@0.5.3-next.0 - - @backstage/catalog-model@1.3.0 + - @backstage/backend-defaults@0.1.11-next.0 - @backstage/plugin-auth-node@0.2.15-next.0 - - @backstage/plugin-azure-devops-backend@0.3.25-next.0 - - @backstage/plugin-azure-sites-backend@0.1.8-next.0 - - @backstage/plugin-events-backend@0.2.7-next.0 - - @backstage/plugin-events-node@0.2.7-next.0 - - @backstage/plugin-graphql-backend@0.1.36-next.0 - - @backstage/plugin-kafka-backend@0.2.39-next.0 - @backstage/plugin-permission-backend@0.5.21-next.0 - @backstage/plugin-permission-common@0.7.5 - @backstage/plugin-permission-node@0.7.9-next.0 - - @backstage/plugin-proxy-backend@0.2.40-next.0 - - @backstage/plugin-rollbar-backend@0.1.43-next.0 - @backstage/plugin-search-backend@1.3.2-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.1-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.7-next.0 - @backstage/plugin-search-backend-node@1.2.2-next.0 - - @backstage/plugin-search-common@1.2.3 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.30-next.0 - - @backstage/plugin-tech-insights-node@0.4.4-next.0 -## 0.2.83 +## 0.0.11 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.14.0 - - @backstage/plugin-devtools-backend@0.1.0 - @backstage/plugin-catalog-backend@1.9.1 - - @backstage/backend-common@0.18.5 - @backstage/plugin-kubernetes-backend@0.11.0 - - @backstage/plugin-auth-backend@0.18.3 - - @backstage/plugin-badges-backend@0.2.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.0 - - @backstage/integration@1.4.5 - @backstage/plugin-todo-backend@0.1.42 - - @backstage/plugin-jenkins-backend@0.2.0 - - @backstage/plugin-azure-sites-backend@0.1.7 - @backstage/plugin-permission-node@0.7.8 - @backstage/plugin-search-backend@1.3.1 - - example-app@0.2.83 - - @backstage/backend-tasks@0.5.2 + - @backstage/backend-defaults@0.1.10 - @backstage/plugin-app-backend@0.3.45 - @backstage/plugin-auth-node@0.2.14 - - @backstage/plugin-catalog-node@1.3.6 - - @backstage/plugin-entity-feedback-backend@0.1.3 - - @backstage/plugin-events-backend@0.2.6 - - @backstage/plugin-playlist-backend@0.3.1 - - @backstage/plugin-rollbar-backend@0.1.42 - - @backstage/plugin-search-backend-module-pg@0.5.6 - - @backstage/plugin-tech-insights-backend@0.5.11 + - @backstage/plugin-search-backend-module-catalog@0.1.1 + - @backstage/plugin-search-backend-module-explore@0.1.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.1 - @backstage/plugin-techdocs-backend@1.6.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.14 - - @backstage/plugin-adr-backend@0.3.3 - - @backstage/plugin-azure-devops-backend@0.3.24 - - @backstage/plugin-code-coverage-backend@0.2.11 - - @backstage/plugin-explore-backend@0.0.7 - - @backstage/plugin-graphql-backend@0.1.35 - - @backstage/plugin-kafka-backend@0.2.38 - - @backstage/plugin-lighthouse-backend@0.2.1 - - @backstage/plugin-linguist-backend@0.2.2 - @backstage/plugin-permission-backend@0.5.20 - - @backstage/plugin-proxy-backend@0.2.39 - @backstage/plugin-search-backend-node@1.2.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.29 - - @backstage/plugin-tech-insights-node@0.4.3 - - @backstage/catalog-client@1.4.1 - - @backstage/catalog-model@1.3.0 - - @backstage/config@1.0.7 - - @backstage/plugin-events-node@0.2.6 - @backstage/plugin-permission-common@0.7.5 - - @backstage/plugin-search-common@1.2.3 -## 0.2.83-next.2 +## 0.0.11-next.2 ### Patch Changes - Updated dependencies - - @backstage/plugin-devtools-backend@0.1.0-next.0 - @backstage/plugin-catalog-backend@1.9.1-next.2 - - @backstage/plugin-badges-backend@0.2.0-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.3.0-next.2 - @backstage/plugin-kubernetes-backend@0.11.0-next.2 - - @backstage/plugin-auth-backend@0.18.3-next.2 - @backstage/plugin-search-backend@1.3.1-next.2 - - example-app@0.2.83-next.2 - @backstage/plugin-scaffolder-backend@1.13.2-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.14-next.2 - - @backstage/config@1.0.7 -## 0.2.83-next.1 +## 0.0.11-next.1 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.18.5-next.1 - @backstage/plugin-kubernetes-backend@0.11.0-next.1 - @backstage/plugin-catalog-backend@1.9.1-next.1 - - @backstage/plugin-jenkins-backend@0.1.35-next.1 - @backstage/plugin-scaffolder-backend@1.13.2-next.1 - - example-app@0.2.83-next.1 - - @backstage/backend-tasks@0.5.2-next.1 - - @backstage/plugin-adr-backend@0.3.3-next.1 + - @backstage/backend-defaults@0.1.10-next.1 - @backstage/plugin-app-backend@0.3.45-next.1 - - @backstage/plugin-auth-backend@0.18.3-next.1 - @backstage/plugin-auth-node@0.2.14-next.1 - - @backstage/plugin-azure-devops-backend@0.3.24-next.1 - - @backstage/plugin-azure-sites-backend@0.1.7-next.1 - - @backstage/plugin-badges-backend@0.1.39-next.1 - - @backstage/plugin-catalog-node@1.3.6-next.1 - - @backstage/plugin-code-coverage-backend@0.2.11-next.1 - - @backstage/plugin-entity-feedback-backend@0.1.3-next.1 - - @backstage/plugin-events-backend@0.2.6-next.1 - - @backstage/plugin-explore-backend@0.0.7-next.1 - - @backstage/plugin-graphql-backend@0.1.35-next.1 - - @backstage/plugin-kafka-backend@0.2.38-next.1 - - @backstage/plugin-lighthouse-backend@0.2.1-next.1 - - @backstage/plugin-linguist-backend@0.2.2-next.1 - @backstage/plugin-permission-backend@0.5.20-next.1 - @backstage/plugin-permission-node@0.7.8-next.1 - - @backstage/plugin-playlist-backend@0.3.1-next.1 - - @backstage/plugin-proxy-backend@0.2.39-next.1 - - @backstage/plugin-rollbar-backend@0.1.42-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.14-next.1 - @backstage/plugin-search-backend@1.3.1-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.2.1-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.6-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.1-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.1-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.1-next.1 - @backstage/plugin-search-backend-node@1.2.1-next.1 - - @backstage/plugin-tech-insights-backend@0.5.11-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.29-next.1 - - @backstage/plugin-tech-insights-node@0.4.3-next.1 - @backstage/plugin-techdocs-backend@1.6.2-next.1 - @backstage/plugin-todo-backend@0.1.42-next.1 - - @backstage/config@1.0.7 - - @backstage/plugin-events-node@0.2.6-next.1 -## 0.2.83-next.0 +## 0.0.11-next.0 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.18.5-next.0 - - @backstage/integration@1.4.5-next.0 - @backstage/plugin-permission-node@0.7.8-next.0 - @backstage/plugin-scaffolder-backend@1.13.2-next.0 - @backstage/plugin-kubernetes-backend@0.11.0-next.0 - - @backstage/backend-tasks@0.5.2-next.0 + - @backstage/backend-defaults@0.1.10-next.0 - @backstage/plugin-app-backend@0.3.45-next.0 - - @backstage/plugin-auth-backend@0.18.3-next.0 - @backstage/plugin-auth-node@0.2.14-next.0 - @backstage/plugin-catalog-backend@1.9.1-next.0 - - @backstage/plugin-catalog-node@1.3.6-next.0 - - @backstage/plugin-entity-feedback-backend@0.1.3-next.0 - - @backstage/plugin-events-backend@0.2.6-next.0 - - @backstage/plugin-playlist-backend@0.3.1-next.0 - - @backstage/plugin-rollbar-backend@0.1.42-next.0 - @backstage/plugin-search-backend@1.3.1-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.6-next.0 - - @backstage/plugin-tech-insights-backend@0.5.11-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.1-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.1-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.1-next.0 - @backstage/plugin-techdocs-backend@1.6.2-next.0 - - example-app@0.2.83-next.0 - - @backstage/plugin-adr-backend@0.3.3-next.0 - - @backstage/plugin-azure-devops-backend@0.3.24-next.0 - - @backstage/plugin-azure-sites-backend@0.1.7-next.0 - - @backstage/plugin-badges-backend@0.1.39-next.0 - - @backstage/plugin-code-coverage-backend@0.2.11-next.0 - - @backstage/plugin-explore-backend@0.0.7-next.0 - - @backstage/plugin-graphql-backend@0.1.35-next.0 - - @backstage/plugin-jenkins-backend@0.1.35-next.0 - - @backstage/plugin-kafka-backend@0.2.38-next.0 - - @backstage/plugin-lighthouse-backend@0.2.1-next.0 - - @backstage/plugin-linguist-backend@0.2.2-next.0 - @backstage/plugin-permission-backend@0.5.20-next.0 - - @backstage/plugin-proxy-backend@0.2.39-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.14-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.2.1-next.0 - @backstage/plugin-search-backend-node@1.2.1-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.29-next.0 - - @backstage/plugin-tech-insights-node@0.4.3-next.0 - @backstage/plugin-todo-backend@0.1.42-next.0 - - @backstage/catalog-client@1.4.1 - - @backstage/catalog-model@1.3.0 - - @backstage/config@1.0.7 - - @backstage/plugin-events-node@0.2.6-next.0 - @backstage/plugin-permission-common@0.7.5 - - @backstage/plugin-search-common@1.2.3 -## 0.2.82 +## 0.0.10 ### Patch Changes - Updated dependencies - @backstage/plugin-kubernetes-backend@0.10.0 - - @backstage/backend-common@0.18.4 - @backstage/plugin-scaffolder-backend@1.13.0 - @backstage/plugin-catalog-backend@1.9.0 - - @backstage/plugin-code-coverage-backend@0.2.10 - - @backstage/catalog-client@1.4.1 - @backstage/plugin-permission-node@0.7.7 - @backstage/plugin-permission-backend@0.5.19 - - @backstage/plugin-entity-feedback-backend@0.1.2 - - @backstage/plugin-rollbar-backend@0.1.41 - @backstage/plugin-search-backend@1.3.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.2.0 - - @backstage/plugin-search-backend-module-pg@0.5.5 - - @backstage/plugin-auth-backend@0.18.2 - - @backstage/plugin-lighthouse-backend@0.2.0 - @backstage/plugin-permission-common@0.7.5 - - @backstage/plugin-playlist-backend@0.3.0 - - @backstage/backend-tasks@0.5.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28 - - @backstage/plugin-adr-backend@0.3.2 - - @backstage/plugin-graphql-backend@0.1.34 - - @backstage/catalog-model@1.3.0 - @backstage/plugin-techdocs-backend@1.6.1 - - @backstage/plugin-explore-backend@0.0.6 - - @backstage/plugin-events-backend@0.2.5 - @backstage/plugin-search-backend-node@1.2.0 - - @backstage/integration@1.4.4 - - example-app@0.2.82 + - @backstage/plugin-search-backend-module-techdocs@0.1.0 + - @backstage/plugin-search-backend-module-catalog@0.1.0 + - @backstage/plugin-search-backend-module-explore@0.1.0 + - @backstage/backend-defaults@0.1.9 - @backstage/plugin-app-backend@0.3.44 - @backstage/plugin-auth-node@0.2.13 - - @backstage/plugin-azure-devops-backend@0.3.23 - - @backstage/plugin-azure-sites-backend@0.1.6 - - @backstage/plugin-badges-backend@0.1.38 - - @backstage/plugin-catalog-node@1.3.5 - - @backstage/plugin-jenkins-backend@0.1.34 - - @backstage/plugin-kafka-backend@0.2.37 - - @backstage/plugin-linguist-backend@0.2.1 - - @backstage/plugin-proxy-backend@0.2.38 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.12 - - @backstage/plugin-tech-insights-backend@0.5.10 - - @backstage/plugin-tech-insights-node@0.4.2 - @backstage/plugin-todo-backend@0.1.41 - - @backstage/config@1.0.7 - - @backstage/plugin-events-node@0.2.5 - - @backstage/plugin-search-common@1.2.3 -## 0.2.82-next.3 +## 0.0.10-next.3 ### Patch Changes - Updated dependencies - @backstage/plugin-kubernetes-backend@0.10.0-next.3 - @backstage/plugin-catalog-backend@1.9.0-next.3 - - @backstage/plugin-code-coverage-backend@0.2.10-next.3 - - @backstage/plugin-lighthouse-backend@0.2.0-next.3 - - @backstage/plugin-auth-backend@0.18.2-next.3 - @backstage/plugin-scaffolder-backend@1.13.0-next.3 - - @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.3 - - @backstage/catalog-model@1.3.0-next.0 - - @backstage/plugin-events-backend@0.2.5-next.3 - - example-app@0.2.82-next.3 - - @backstage/backend-common@0.18.4-next.2 - - @backstage/backend-tasks@0.5.1-next.2 - - @backstage/catalog-client@1.4.1-next.1 - - @backstage/config@1.0.7 - - @backstage/integration@1.4.4-next.0 - - @backstage/plugin-adr-backend@0.3.2-next.3 + - @backstage/backend-defaults@0.1.9-next.2 - @backstage/plugin-app-backend@0.3.44-next.2 - @backstage/plugin-auth-node@0.2.13-next.2 - - @backstage/plugin-azure-devops-backend@0.3.23-next.2 - - @backstage/plugin-azure-sites-backend@0.1.6-next.2 - - @backstage/plugin-badges-backend@0.1.38-next.3 - - @backstage/plugin-catalog-node@1.3.5-next.3 - - @backstage/plugin-entity-feedback-backend@0.1.2-next.3 - - @backstage/plugin-events-node@0.2.5-next.2 - - @backstage/plugin-explore-backend@0.0.6-next.2 - - @backstage/plugin-graphql-backend@0.1.34-next.3 - - @backstage/plugin-jenkins-backend@0.1.34-next.3 - - @backstage/plugin-kafka-backend@0.2.37-next.3 - - @backstage/plugin-linguist-backend@0.2.1-next.3 - @backstage/plugin-permission-backend@0.5.19-next.2 - @backstage/plugin-permission-common@0.7.5-next.0 - @backstage/plugin-permission-node@0.7.7-next.2 - - @backstage/plugin-playlist-backend@0.2.7-next.3 - - @backstage/plugin-proxy-backend@0.2.38-next.2 - - @backstage/plugin-rollbar-backend@0.1.41-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.3 - @backstage/plugin-search-backend@1.3.0-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.5-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.2 + - @backstage/plugin-search-backend-module-explore@0.1.0-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.2 - @backstage/plugin-search-backend-node@1.2.0-next.2 - - @backstage/plugin-search-common@1.2.3-next.0 - - @backstage/plugin-tech-insights-backend@0.5.10-next.3 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.2 - - @backstage/plugin-tech-insights-node@0.4.2-next.2 - @backstage/plugin-techdocs-backend@1.6.1-next.3 - @backstage/plugin-todo-backend@0.1.41-next.3 -## 0.2.82-next.2 +## 0.0.10-next.2 ### Patch Changes - Updated dependencies - @backstage/plugin-kubernetes-backend@0.10.0-next.2 - @backstage/plugin-catalog-backend@1.8.1-next.2 - - @backstage/backend-common@0.18.4-next.2 - - @backstage/catalog-client@1.4.1-next.0 - @backstage/plugin-permission-node@0.7.7-next.2 - @backstage/plugin-permission-backend@0.5.19-next.2 - - @backstage/plugin-rollbar-backend@0.1.41-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.2 - @backstage/plugin-scaffolder-backend@1.13.0-next.2 - - example-app@0.2.82-next.2 - - @backstage/backend-tasks@0.5.1-next.2 - - @backstage/catalog-model@1.2.1 - - @backstage/config@1.0.7 - - @backstage/integration@1.4.4-next.0 - - @backstage/plugin-adr-backend@0.3.2-next.2 + - @backstage/backend-defaults@0.1.9-next.2 - @backstage/plugin-app-backend@0.3.44-next.2 - - @backstage/plugin-auth-backend@0.18.2-next.2 - @backstage/plugin-auth-node@0.2.13-next.2 - - @backstage/plugin-azure-devops-backend@0.3.23-next.2 - - @backstage/plugin-azure-sites-backend@0.1.6-next.2 - - @backstage/plugin-badges-backend@0.1.38-next.2 - - @backstage/plugin-catalog-node@1.3.5-next.2 - - @backstage/plugin-code-coverage-backend@0.2.10-next.2 - - @backstage/plugin-entity-feedback-backend@0.1.2-next.2 - - @backstage/plugin-events-backend@0.2.5-next.2 - - @backstage/plugin-events-node@0.2.5-next.2 - - @backstage/plugin-explore-backend@0.0.6-next.2 - - @backstage/plugin-graphql-backend@0.1.34-next.2 - - @backstage/plugin-jenkins-backend@0.1.34-next.2 - - @backstage/plugin-kafka-backend@0.2.37-next.2 - - @backstage/plugin-lighthouse-backend@0.1.2-next.2 - - @backstage/plugin-linguist-backend@0.2.1-next.2 - @backstage/plugin-permission-common@0.7.5-next.0 - - @backstage/plugin-playlist-backend@0.2.7-next.2 - - @backstage/plugin-proxy-backend@0.2.38-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.2 - @backstage/plugin-search-backend@1.3.0-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.5-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.0-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.1 - @backstage/plugin-search-backend-node@1.2.0-next.2 - - @backstage/plugin-search-common@1.2.3-next.0 - - @backstage/plugin-tech-insights-backend@0.5.10-next.2 - - @backstage/plugin-tech-insights-node@0.4.2-next.2 - @backstage/plugin-techdocs-backend@1.6.1-next.2 - @backstage/plugin-todo-backend@0.1.41-next.2 -## 0.2.82-next.1 +## 0.0.10-next.1 ### Patch Changes - Updated dependencies - @backstage/plugin-search-backend@1.3.0-next.1 - @backstage/plugin-scaffolder-backend@1.13.0-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.2.0-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.5-next.1 - - @backstage/plugin-permission-node@0.7.7-next.1 - - @backstage/plugin-permission-backend@0.5.19-next.1 - - @backstage/plugin-permission-common@0.7.5-next.0 - - @backstage/plugin-playlist-backend@0.2.7-next.1 - @backstage/plugin-catalog-backend@1.8.1-next.1 - - @backstage/backend-tasks@0.5.1-next.1 - - @backstage/plugin-adr-backend@0.3.2-next.1 - @backstage/plugin-kubernetes-backend@0.10.0-next.1 - @backstage/plugin-techdocs-backend@1.6.1-next.1 - - @backstage/plugin-explore-backend@0.0.6-next.1 - @backstage/plugin-search-backend-node@1.2.0-next.1 - - @backstage/integration@1.4.4-next.0 - - @backstage/plugin-auth-backend@0.18.2-next.1 - - example-app@0.2.82-next.1 - - @backstage/backend-common@0.18.4-next.1 - - @backstage/catalog-client@1.4.0 - - @backstage/catalog-model@1.2.1 - - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-module-techdocs@0.1.0-next.0 + - @backstage/plugin-search-backend-module-catalog@0.1.0-next.0 + - @backstage/plugin-search-backend-module-explore@0.1.0-next.0 + - @backstage/backend-defaults@0.1.9-next.1 - @backstage/plugin-app-backend@0.3.44-next.1 - - @backstage/plugin-auth-node@0.2.13-next.1 - - @backstage/plugin-azure-devops-backend@0.3.23-next.1 - - @backstage/plugin-azure-sites-backend@0.1.6-next.1 - - @backstage/plugin-badges-backend@0.1.38-next.1 - - @backstage/plugin-catalog-node@1.3.5-next.1 - - @backstage/plugin-code-coverage-backend@0.2.10-next.1 - - @backstage/plugin-entity-feedback-backend@0.1.2-next.1 - - @backstage/plugin-events-backend@0.2.5-next.1 - - @backstage/plugin-events-node@0.2.5-next.1 - - @backstage/plugin-graphql-backend@0.1.34-next.1 - - @backstage/plugin-jenkins-backend@0.1.34-next.1 - - @backstage/plugin-kafka-backend@0.2.37-next.1 - - @backstage/plugin-lighthouse-backend@0.1.2-next.1 - - @backstage/plugin-linguist-backend@0.2.1-next.1 - - @backstage/plugin-proxy-backend@0.2.38-next.1 - - @backstage/plugin-rollbar-backend@0.1.41-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.1 - - @backstage/plugin-search-common@1.2.3-next.0 - - @backstage/plugin-tech-insights-backend@0.5.10-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.1 - - @backstage/plugin-tech-insights-node@0.4.2-next.1 - @backstage/plugin-todo-backend@0.1.41-next.1 -## 0.2.82-next.0 +## 0.0.10-next.0 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.12.1-next.0 - - @backstage/plugin-kubernetes-backend@0.10.0-next.0 - - @backstage/plugin-entity-feedback-backend@0.1.2-next.0 - - @backstage/plugin-auth-backend@0.18.2-next.0 - @backstage/plugin-catalog-backend@1.8.1-next.0 - - @backstage/plugin-graphql-backend@0.1.34-next.0 - - @backstage/backend-common@0.18.4-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.12-next.0 - - example-app@0.2.82-next.0 - - @backstage/config@1.0.7 - - @backstage/integration@1.4.3 - - @backstage/backend-tasks@0.5.1-next.0 - - @backstage/catalog-client@1.4.0 - - @backstage/catalog-model@1.2.1 - - @backstage/plugin-adr-backend@0.3.2-next.0 + - @backstage/backend-defaults@0.1.9-next.0 - @backstage/plugin-app-backend@0.3.44-next.0 - - @backstage/plugin-auth-node@0.2.13-next.0 - - @backstage/plugin-azure-devops-backend@0.3.23-next.0 - - @backstage/plugin-azure-sites-backend@0.1.6-next.0 - - @backstage/plugin-badges-backend@0.1.38-next.0 - - @backstage/plugin-catalog-node@1.3.5-next.0 - - @backstage/plugin-code-coverage-backend@0.2.10-next.0 - - @backstage/plugin-events-backend@0.2.5-next.0 - - @backstage/plugin-events-node@0.2.5-next.0 - - @backstage/plugin-explore-backend@0.0.6-next.0 - - @backstage/plugin-jenkins-backend@0.1.34-next.0 - - @backstage/plugin-kafka-backend@0.2.37-next.0 - - @backstage/plugin-lighthouse-backend@0.1.2-next.0 - - @backstage/plugin-linguist-backend@0.2.1-next.0 - - @backstage/plugin-permission-backend@0.5.19-next.0 - - @backstage/plugin-permission-common@0.7.4 - - @backstage/plugin-permission-node@0.7.7-next.0 - - @backstage/plugin-playlist-backend@0.2.7-next.0 - - @backstage/plugin-proxy-backend@0.2.38-next.0 - - @backstage/plugin-rollbar-backend@0.1.41-next.0 - - @backstage/plugin-search-backend@1.2.5-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.5-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.5-next.0 - - @backstage/plugin-search-backend-node@1.1.5-next.0 - - @backstage/plugin-search-common@1.2.2 - - @backstage/plugin-tech-insights-backend@0.5.10-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.28-next.0 - - @backstage/plugin-tech-insights-node@0.4.2-next.0 - @backstage/plugin-techdocs-backend@1.6.1-next.0 - @backstage/plugin-todo-backend@0.1.41-next.0 -## 0.2.81 +## 0.0.9 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.12.0 - @backstage/plugin-catalog-backend@1.8.0 - - @backstage/catalog-client@1.4.0 - @backstage/plugin-todo-backend@0.1.40 - - @backstage/plugin-permission-node@0.7.6 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.4 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27 - - @backstage/plugin-auth-node@0.2.12 - @backstage/plugin-techdocs-backend@1.6.0 - - @backstage/backend-tasks@0.5.0 - - @backstage/plugin-tech-insights-backend@0.5.9 - - @backstage/plugin-adr-backend@0.3.1 - - @backstage/plugin-auth-backend@0.18.1 - - @backstage/backend-common@0.18.3 - - @backstage/plugin-linguist-backend@0.2.0 - - @backstage/plugin-catalog-node@1.3.4 - - @backstage/catalog-model@1.2.1 - - @backstage/plugin-events-backend@0.2.4 + - @backstage/backend-defaults@0.1.8 - @backstage/plugin-app-backend@0.3.43 - - @backstage/plugin-events-node@0.2.4 - - @backstage/integration@1.4.3 - - @backstage/plugin-azure-devops-backend@0.3.22 - - @backstage/plugin-azure-sites-backend@0.1.5 - - @backstage/plugin-code-coverage-backend@0.2.9 - - @backstage/plugin-entity-feedback-backend@0.1.1 - - @backstage/plugin-explore-backend@0.0.5 - - @backstage/plugin-graphql-backend@0.1.33 - - @backstage/plugin-jenkins-backend@0.1.33 - - @backstage/plugin-kubernetes-backend@0.9.4 - - @backstage/plugin-permission-backend@0.5.18 - - @backstage/plugin-permission-common@0.7.4 - - @backstage/plugin-playlist-backend@0.2.6 - - @backstage/plugin-proxy-backend@0.2.37 - - @backstage/plugin-rollbar-backend@0.1.40 - - @backstage/plugin-lighthouse-backend@0.1.1 - - @backstage/config@1.0.7 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.11 - - @backstage/plugin-badges-backend@0.1.37 - - example-app@0.2.81 - - @backstage/plugin-search-backend@1.2.4 - - @backstage/plugin-kafka-backend@0.2.36 - - @backstage/plugin-search-backend-module-pg@0.5.4 - - @backstage/plugin-search-backend-node@1.1.4 - - @backstage/plugin-search-common@1.2.2 - - @backstage/plugin-tech-insights-node@0.4.1 -## 0.2.81-next.2 +## 0.0.9-next.2 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.12.0-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.4-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27-next.2 - - @backstage/plugin-auth-node@0.2.12-next.2 - - @backstage/backend-tasks@0.5.0-next.2 - - @backstage/plugin-adr-backend@0.3.1-next.2 - - @backstage/backend-common@0.18.3-next.2 - - @backstage/plugin-linguist-backend@0.2.0-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.11-next.2 - - example-app@0.2.81-next.2 - - @backstage/plugin-techdocs-backend@1.5.4-next.2 - - @backstage/plugin-auth-backend@0.18.1-next.2 - - @backstage/plugin-entity-feedback-backend@0.1.1-next.2 - - @backstage/plugin-jenkins-backend@0.1.33-next.2 - - @backstage/plugin-kubernetes-backend@0.9.4-next.2 - - @backstage/plugin-permission-backend@0.5.18-next.2 - - @backstage/plugin-permission-node@0.7.6-next.2 - - @backstage/plugin-playlist-backend@0.2.6-next.2 - - @backstage/plugin-search-backend@1.2.4-next.2 - - @backstage/plugin-lighthouse-backend@0.1.1-next.2 - - @backstage/plugin-search-backend-node@1.1.4-next.2 - - @backstage/plugin-tech-insights-backend@0.5.9-next.2 - - @backstage/plugin-tech-insights-node@0.4.1-next.2 + - @backstage/backend-defaults@0.1.8-next.2 - @backstage/plugin-app-backend@0.3.43-next.2 - - @backstage/plugin-azure-devops-backend@0.3.22-next.2 - - @backstage/plugin-azure-sites-backend@0.1.5-next.2 - - @backstage/plugin-badges-backend@0.1.37-next.2 - @backstage/plugin-catalog-backend@1.8.0-next.2 - - @backstage/plugin-catalog-node@1.3.4-next.2 - - @backstage/plugin-code-coverage-backend@0.2.9-next.2 - - @backstage/plugin-events-backend@0.2.4-next.2 - - @backstage/plugin-explore-backend@0.0.5-next.2 - - @backstage/plugin-graphql-backend@0.1.33-next.2 - - @backstage/plugin-kafka-backend@0.2.36-next.2 - - @backstage/plugin-proxy-backend@0.2.37-next.2 - - @backstage/plugin-rollbar-backend@0.1.40-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.4-next.2 - @backstage/plugin-todo-backend@0.1.40-next.2 - - @backstage/plugin-events-node@0.2.4-next.2 - - @backstage/config@1.0.7-next.0 - - @backstage/integration@1.4.3-next.0 -## 0.2.81-next.1 +## 0.0.9-next.1 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.12.0-next.1 - - @backstage/plugin-permission-node@0.7.6-next.1 - - @backstage/plugin-techdocs-backend@1.5.4-next.1 - - @backstage/plugin-auth-backend@0.18.1-next.1 - - @backstage/backend-common@0.18.3-next.1 - - @backstage/catalog-client@1.4.0-next.1 - - @backstage/integration@1.4.3-next.0 - - @backstage/plugin-adr-backend@0.3.1-next.1 - @backstage/plugin-app-backend@0.3.43-next.1 - - @backstage/plugin-auth-node@0.2.12-next.1 - - @backstage/plugin-azure-devops-backend@0.3.22-next.1 - - @backstage/plugin-azure-sites-backend@0.1.5-next.1 - @backstage/plugin-catalog-backend@1.8.0-next.1 - - @backstage/plugin-code-coverage-backend@0.2.9-next.1 - - @backstage/plugin-entity-feedback-backend@0.1.1-next.1 - - @backstage/plugin-explore-backend@0.0.5-next.1 - - @backstage/plugin-graphql-backend@0.1.33-next.1 - - @backstage/plugin-jenkins-backend@0.1.33-next.1 - - @backstage/plugin-kubernetes-backend@0.9.4-next.1 - - @backstage/plugin-linguist-backend@0.2.0-next.1 - - @backstage/plugin-permission-backend@0.5.18-next.1 - - @backstage/plugin-permission-common@0.7.4-next.0 - - @backstage/plugin-playlist-backend@0.2.6-next.1 - - @backstage/plugin-proxy-backend@0.2.37-next.1 - - @backstage/plugin-rollbar-backend@0.1.40-next.1 - @backstage/plugin-todo-backend@0.1.40-next.1 - - @backstage/plugin-lighthouse-backend@0.1.1-next.1 - - @backstage/backend-tasks@0.4.4-next.1 - - @backstage/config@1.0.7-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.11-next.1 - - @backstage/plugin-search-backend@1.2.4-next.1 - - example-app@0.2.81-next.1 - - @backstage/catalog-model@1.2.1-next.1 - - @backstage/plugin-badges-backend@0.1.37-next.1 - - @backstage/plugin-catalog-node@1.3.4-next.1 - - @backstage/plugin-events-backend@0.2.4-next.1 - - @backstage/plugin-events-node@0.2.4-next.1 - - @backstage/plugin-kafka-backend@0.2.36-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.4-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.4-next.1 - - @backstage/plugin-search-backend-node@1.1.4-next.1 - - @backstage/plugin-search-common@1.2.2-next.0 - - @backstage/plugin-tech-insights-backend@0.5.9-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27-next.1 - - @backstage/plugin-tech-insights-node@0.4.1-next.1 + - @backstage/backend-defaults@0.1.8-next.1 -## 0.2.81-next.0 +## 0.0.9-next.0 ### Patch Changes - Updated dependencies - - @backstage/catalog-client@1.4.0-next.0 - @backstage/plugin-todo-backend@0.1.40-next.0 - @backstage/plugin-scaffolder-backend@1.11.1-next.0 - @backstage/plugin-catalog-backend@1.8.0-next.0 - - @backstage/plugin-tech-insights-backend@0.5.9-next.0 - - @backstage/plugin-linguist-backend@0.2.0-next.0 - - @backstage/plugin-adr-backend@0.3.1-next.0 - - @backstage/backend-tasks@0.4.4-next.0 - - @backstage/plugin-techdocs-backend@1.5.4-next.0 - - @backstage/backend-common@0.18.3-next.0 - - @backstage/catalog-model@1.2.1-next.0 - - @backstage/plugin-events-backend@0.2.4-next.0 - - @backstage/plugin-catalog-node@1.3.4-next.0 + - @backstage/backend-defaults@0.1.8-next.0 - @backstage/plugin-app-backend@0.3.43-next.0 - - @backstage/plugin-events-node@0.2.4-next.0 - - @backstage/plugin-proxy-backend@0.2.37-next.0 - - @backstage/plugin-auth-backend@0.18.1-next.0 - - @backstage/plugin-badges-backend@0.1.37-next.0 - - @backstage/plugin-code-coverage-backend@0.2.9-next.0 - - @backstage/plugin-entity-feedback-backend@0.1.1-next.0 - - @backstage/plugin-jenkins-backend@0.1.33-next.0 - - @backstage/plugin-kubernetes-backend@0.9.4-next.0 - - @backstage/plugin-lighthouse-backend@0.1.1-next.0 - - @backstage/plugin-playlist-backend@0.2.6-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.11-next.0 - - example-app@0.2.81-next.0 - - @backstage/config@1.0.6 - - @backstage/integration@1.4.2 - - @backstage/plugin-auth-node@0.2.12-next.0 - - @backstage/plugin-azure-devops-backend@0.3.22-next.0 - - @backstage/plugin-azure-sites-backend@0.1.5-next.0 - - @backstage/plugin-explore-backend@0.0.5-next.0 - - @backstage/plugin-graphql-backend@0.1.33-next.0 - - @backstage/plugin-kafka-backend@0.2.36-next.0 - - @backstage/plugin-permission-backend@0.5.18-next.0 - - @backstage/plugin-permission-common@0.7.3 - - @backstage/plugin-permission-node@0.7.6-next.0 - - @backstage/plugin-rollbar-backend@0.1.40-next.0 - - @backstage/plugin-search-backend@1.2.4-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.4-next.0 - - @backstage/plugin-search-backend-module-pg@0.5.4-next.0 - - @backstage/plugin-search-backend-node@1.1.4-next.0 - - @backstage/plugin-search-common@1.2.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27-next.0 - - @backstage/plugin-tech-insights-node@0.4.1-next.0 -## 0.2.80 +## 0.0.8 ### Patch Changes - Updated dependencies - @backstage/plugin-catalog-backend@1.7.2 - - @backstage/plugin-playlist-backend@0.2.5 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.3 - - @backstage/backend-common@0.18.2 - - @backstage/plugin-kubernetes-backend@0.9.3 - - @backstage/plugin-lighthouse-backend@0.1.0 - - @backstage/plugin-code-coverage-backend@0.2.8 - - @backstage/plugin-azure-devops-backend@0.3.21 - - @backstage/plugin-azure-sites-backend@0.1.4 - - @backstage/plugin-adr-backend@0.3.0 - - @backstage/plugin-tech-insights-backend@0.5.8 - - @backstage/plugin-tech-insights-node@0.4.0 - - @backstage/plugin-entity-feedback-backend@0.1.0 - - @backstage/plugin-search-backend@1.2.3 - - @backstage/plugin-techdocs-backend@1.5.3 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.10 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26 - @backstage/plugin-scaffolder-backend@1.11.0 - - @backstage/plugin-events-backend@0.2.3 - - @backstage/plugin-kafka-backend@0.2.35 - - @backstage/plugin-proxy-backend@0.2.36 - @backstage/plugin-app-backend@0.3.42 - - @backstage/catalog-model@1.2.0 - - @backstage/plugin-auth-backend@0.18.0 - - @backstage/plugin-linguist-backend@0.1.0 - - @backstage/plugin-events-node@0.2.3 - - example-app@0.2.80 - - @backstage/plugin-catalog-node@1.3.3 - - @backstage/backend-tasks@0.4.3 - - @backstage/catalog-client@1.3.1 - - @backstage/config@1.0.6 - - @backstage/integration@1.4.2 - - @backstage/plugin-auth-node@0.2.11 - - @backstage/plugin-badges-backend@0.1.36 - - @backstage/plugin-explore-backend@0.0.4 - - @backstage/plugin-graphql-backend@0.1.32 - - @backstage/plugin-jenkins-backend@0.1.32 - - @backstage/plugin-permission-backend@0.5.17 - - @backstage/plugin-permission-common@0.7.3 - - @backstage/plugin-permission-node@0.7.5 - - @backstage/plugin-rollbar-backend@0.1.39 - - @backstage/plugin-search-backend-module-pg@0.5.3 - - @backstage/plugin-search-backend-node@1.1.3 - - @backstage/plugin-search-common@1.2.1 - - @backstage/plugin-todo-backend@0.1.39 + - @backstage/backend-defaults@0.1.7 -## 0.2.80-next.2 +## 0.0.8-next.2 ### Patch Changes - Updated dependencies - - @backstage/plugin-lighthouse-backend@0.1.0-next.0 - - @backstage/backend-common@0.18.2-next.2 - @backstage/plugin-catalog-backend@1.7.2-next.2 - - @backstage/plugin-search-backend@1.2.3-next.2 - @backstage/plugin-scaffolder-backend@1.11.0-next.2 - - @backstage/plugin-events-backend@0.2.3-next.2 - - @backstage/plugin-kafka-backend@0.2.35-next.2 - - @backstage/plugin-proxy-backend@0.2.36-next.2 - @backstage/plugin-app-backend@0.3.42-next.2 - - @backstage/catalog-model@1.2.0-next.1 - - @backstage/plugin-kubernetes-backend@0.9.3-next.2 - - @backstage/plugin-events-node@0.2.3-next.2 - - @backstage/plugin-catalog-node@1.3.3-next.2 - - @backstage/backend-tasks@0.4.3-next.2 - - @backstage/plugin-auth-backend@0.17.5-next.2 - - @backstage/plugin-auth-node@0.2.11-next.2 - - @backstage/plugin-permission-node@0.7.5-next.2 - - @backstage/plugin-playlist-backend@0.2.5-next.2 - - @backstage/plugin-rollbar-backend@0.1.39-next.2 - - @backstage/plugin-search-backend-module-pg@0.5.3-next.2 - - @backstage/plugin-tech-insights-backend@0.5.8-next.2 - - @backstage/plugin-techdocs-backend@1.5.3-next.2 - - example-app@0.2.80-next.2 - - @backstage/catalog-client@1.3.1-next.1 - - @backstage/config@1.0.6 - - @backstage/integration@1.4.2 - - @backstage/plugin-adr-backend@0.2.7-next.2 - - @backstage/plugin-azure-devops-backend@0.3.21-next.2 - - @backstage/plugin-azure-sites-backend@0.1.4-next.2 - - @backstage/plugin-badges-backend@0.1.36-next.2 - - @backstage/plugin-code-coverage-backend@0.2.8-next.2 - - @backstage/plugin-explore-backend@0.0.4-next.2 - - @backstage/plugin-graphql-backend@0.1.32-next.2 - - @backstage/plugin-jenkins-backend@0.1.32-next.2 - - @backstage/plugin-permission-backend@0.5.17-next.2 - - @backstage/plugin-permission-common@0.7.3 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.10-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.3-next.2 - - @backstage/plugin-search-backend-node@1.1.3-next.2 - - @backstage/plugin-search-common@1.2.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26-next.2 - - @backstage/plugin-tech-insights-node@0.4.0-next.2 - - @backstage/plugin-todo-backend@0.1.39-next.2 + - @backstage/backend-defaults@0.1.7-next.2 -## 0.2.80-next.1 +## 0.0.8-next.1 ### Patch Changes - Updated dependencies - @backstage/plugin-catalog-backend@1.7.2-next.1 - - @backstage/plugin-tech-insights-backend@0.5.8-next.1 - - @backstage/plugin-tech-insights-node@0.4.0-next.1 - - @backstage/plugin-azure-devops-backend@0.3.21-next.1 - - @backstage/backend-common@0.18.2-next.1 - - @backstage/plugin-kubernetes-backend@0.9.3-next.1 - @backstage/plugin-scaffolder-backend@1.11.0-next.1 - - @backstage/plugin-playlist-backend@0.2.5-next.1 - - example-app@0.2.80-next.1 - - @backstage/backend-tasks@0.4.3-next.1 - - @backstage/catalog-client@1.3.1-next.0 - - @backstage/catalog-model@1.1.6-next.0 - - @backstage/config@1.0.6 - - @backstage/integration@1.4.2 - - @backstage/plugin-adr-backend@0.2.7-next.1 + - @backstage/backend-defaults@0.1.7-next.1 - @backstage/plugin-app-backend@0.3.42-next.1 - - @backstage/plugin-auth-backend@0.17.5-next.1 - - @backstage/plugin-auth-node@0.2.11-next.1 - - @backstage/plugin-azure-sites-backend@0.1.4-next.1 - - @backstage/plugin-badges-backend@0.1.36-next.1 - - @backstage/plugin-catalog-node@1.3.3-next.1 - - @backstage/plugin-code-coverage-backend@0.2.8-next.1 - - @backstage/plugin-events-backend@0.2.3-next.1 - - @backstage/plugin-events-node@0.2.3-next.1 - - @backstage/plugin-explore-backend@0.0.4-next.1 - - @backstage/plugin-graphql-backend@0.1.32-next.1 - - @backstage/plugin-jenkins-backend@0.1.32-next.1 - - @backstage/plugin-kafka-backend@0.2.35-next.1 - - @backstage/plugin-permission-backend@0.5.17-next.1 - - @backstage/plugin-permission-common@0.7.3 - - @backstage/plugin-permission-node@0.7.5-next.1 - - @backstage/plugin-proxy-backend@0.2.36-next.1 - - @backstage/plugin-rollbar-backend@0.1.39-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.10-next.1 - - @backstage/plugin-search-backend@1.2.3-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.3-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.3-next.1 - - @backstage/plugin-search-backend-node@1.1.3-next.1 - - @backstage/plugin-search-common@1.2.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26-next.1 - - @backstage/plugin-techdocs-backend@1.5.3-next.1 - - @backstage/plugin-todo-backend@0.1.39-next.1 -## 0.2.80-next.0 +## 0.0.8-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/backend-defaults@0.1.7-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 -## 0.2.79 +## 0.0.7 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.10.0 - - @backstage/backend-common@0.18.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.8 - - @backstage/plugin-adr-backend@0.2.5 - - @backstage/catalog-model@1.1.5 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.1 - - @backstage/plugin-search-backend-node@1.1.1 - - @backstage/catalog-client@1.3.0 - - @backstage/plugin-explore-backend@0.0.2 - - @backstage/backend-tasks@0.4.1 - - @backstage/plugin-events-backend@0.2.1 - - @backstage/plugin-catalog-node@1.3.1 + - @backstage/backend-defaults@0.1.5 - @backstage/plugin-app-backend@0.3.40 - - @backstage/plugin-code-coverage-backend@0.2.6 - @backstage/plugin-catalog-backend@1.7.0 - - @backstage/plugin-tech-insights-backend@0.5.6 - - @backstage/plugin-kubernetes-backend@0.9.1 - - @backstage/config@1.0.6 - - @backstage/plugin-search-backend@1.2.1 - - @backstage/plugin-events-node@0.2.1 - - example-app@0.2.79 - - @backstage/integration@1.4.2 - - @backstage/plugin-auth-backend@0.17.3 - - @backstage/plugin-auth-node@0.2.9 - - @backstage/plugin-azure-devops-backend@0.3.19 - - @backstage/plugin-azure-sites-backend@0.1.2 - - @backstage/plugin-badges-backend@0.1.34 - - @backstage/plugin-graphql-backend@0.1.30 - - @backstage/plugin-jenkins-backend@0.1.30 - - @backstage/plugin-kafka-backend@0.2.33 - - @backstage/plugin-permission-backend@0.5.15 - - @backstage/plugin-permission-common@0.7.3 - - @backstage/plugin-permission-node@0.7.3 - - @backstage/plugin-playlist-backend@0.2.3 - - @backstage/plugin-proxy-backend@0.2.34 - - @backstage/plugin-rollbar-backend@0.1.37 - - @backstage/plugin-search-backend-module-pg@0.5.1 - - @backstage/plugin-search-common@1.2.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.24 - - @backstage/plugin-tech-insights-node@0.3.8 - - @backstage/plugin-techdocs-backend@1.5.1 - - @backstage/plugin-todo-backend@0.1.37 -## 0.2.79-next.2 +## 0.0.7-next.2 ### Patch Changes - Updated dependencies - - @backstage/plugin-adr-backend@0.2.5-next.2 - - @backstage/backend-common@0.18.0-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.8-next.2 + - @backstage/backend-defaults@0.1.5-next.1 - @backstage/plugin-scaffolder-backend@1.10.0-next.2 - - @backstage/backend-tasks@0.4.1-next.1 - - @backstage/catalog-client@1.3.0-next.2 - @backstage/plugin-catalog-backend@1.7.0-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.1-next.2 - - @backstage/plugin-events-backend@0.2.1-next.1 - @backstage/plugin-app-backend@0.3.40-next.1 - - @backstage/plugin-kubernetes-backend@0.9.1-next.2 - - @backstage/plugin-catalog-node@1.3.1-next.2 - - @backstage/plugin-events-node@0.2.1-next.1 - - @backstage/plugin-auth-backend@0.17.3-next.2 - - @backstage/plugin-auth-node@0.2.9-next.1 - - @backstage/plugin-permission-node@0.7.3-next.1 - - @backstage/plugin-playlist-backend@0.2.3-next.2 - - @backstage/plugin-rollbar-backend@0.1.37-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.1-next.2 - - @backstage/plugin-tech-insights-backend@0.5.6-next.2 - - @backstage/plugin-techdocs-backend@1.5.1-next.2 - - example-app@0.2.79-next.2 - - @backstage/plugin-azure-devops-backend@0.3.19-next.1 - - @backstage/plugin-azure-sites-backend@0.1.2-next.1 - - @backstage/plugin-badges-backend@0.1.34-next.2 - - @backstage/plugin-code-coverage-backend@0.2.6-next.2 - - @backstage/plugin-explore-backend@0.0.2-next.2 - - @backstage/plugin-graphql-backend@0.1.30-next.2 - - @backstage/plugin-jenkins-backend@0.1.30-next.2 - - @backstage/plugin-kafka-backend@0.2.33-next.2 - - @backstage/plugin-permission-backend@0.5.15-next.1 - - @backstage/plugin-proxy-backend@0.2.34-next.1 - - @backstage/plugin-search-backend@1.2.1-next.2 - - @backstage/plugin-search-backend-node@1.1.1-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.24-next.1 - - @backstage/plugin-tech-insights-node@0.3.8-next.1 - - @backstage/plugin-todo-backend@0.1.37-next.2 - - @backstage/catalog-model@1.1.5-next.1 - - @backstage/config@1.0.6-next.0 - - @backstage/integration@1.4.2-next.0 - - @backstage/plugin-permission-common@0.7.3-next.0 - - @backstage/plugin-search-common@1.2.1-next.0 -## 0.2.79-next.1 +## 0.0.7-next.1 ### Patch Changes - Updated dependencies + - @backstage/backend-defaults@0.1.5-next.0 - @backstage/plugin-scaffolder-backend@1.10.0-next.1 - - @backstage/backend-common@0.18.0-next.0 - - @backstage/plugin-explore-backend@0.0.2-next.1 - - @backstage/plugin-events-backend@0.2.1-next.0 - @backstage/plugin-app-backend@0.3.40-next.0 - - @backstage/plugin-tech-insights-backend@0.5.6-next.1 - - @backstage/config@1.0.6-next.0 - @backstage/plugin-catalog-backend@1.7.0-next.1 - - @backstage/plugin-catalog-node@1.3.1-next.1 - - @backstage/plugin-events-node@0.2.1-next.0 - - example-app@0.2.79-next.1 - - @backstage/backend-tasks@0.4.1-next.0 - - @backstage/catalog-client@1.3.0-next.1 - - @backstage/catalog-model@1.1.5-next.1 - - @backstage/integration@1.4.2-next.0 - - @backstage/plugin-auth-backend@0.17.3-next.1 - - @backstage/plugin-auth-node@0.2.9-next.0 - - @backstage/plugin-azure-devops-backend@0.3.19-next.0 - - @backstage/plugin-azure-sites-backend@0.1.2-next.0 - - @backstage/plugin-badges-backend@0.1.34-next.1 - - @backstage/plugin-code-coverage-backend@0.2.6-next.1 - - @backstage/plugin-graphql-backend@0.1.30-next.1 - - @backstage/plugin-jenkins-backend@0.1.30-next.1 - - @backstage/plugin-kafka-backend@0.2.33-next.1 - - @backstage/plugin-kubernetes-backend@0.9.1-next.1 - - @backstage/plugin-permission-backend@0.5.15-next.0 - - @backstage/plugin-permission-common@0.7.3-next.0 - - @backstage/plugin-permission-node@0.7.3-next.0 - - @backstage/plugin-playlist-backend@0.2.3-next.1 - - @backstage/plugin-proxy-backend@0.2.34-next.0 - - @backstage/plugin-rollbar-backend@0.1.37-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.8-next.1 - - @backstage/plugin-search-backend@1.2.1-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.1-next.1 - - @backstage/plugin-search-backend-module-pg@0.5.1-next.1 - - @backstage/plugin-search-backend-node@1.1.1-next.1 - - @backstage/plugin-search-common@1.2.1-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.24-next.0 - - @backstage/plugin-tech-insights-node@0.3.8-next.0 - - @backstage/plugin-techdocs-backend@1.5.1-next.1 - - @backstage/plugin-todo-backend@0.1.37-next.1 -## 0.2.79-next.0 +## 0.0.7-next.0 ### Patch Changes - Updated dependencies - - @backstage/catalog-model@1.1.5-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.1-next.0 - - @backstage/plugin-search-backend-node@1.1.1-next.0 - - @backstage/catalog-client@1.3.0-next.0 - - @backstage/plugin-explore-backend@0.0.2-next.0 - - @backstage/plugin-code-coverage-backend@0.2.6-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.8-next.0 - @backstage/plugin-scaffolder-backend@1.9.1-next.0 - @backstage/plugin-catalog-backend@1.7.0-next.0 - - @backstage/plugin-search-backend@1.2.1-next.0 - - example-app@0.2.79-next.0 - - @backstage/backend-common@0.17.0 - - @backstage/backend-tasks@0.4.0 - - @backstage/config@1.0.5 - - @backstage/integration@1.4.1 + - @backstage/backend-defaults@0.1.4 - @backstage/plugin-app-backend@0.3.39 - - @backstage/plugin-auth-backend@0.17.3-next.0 - - @backstage/plugin-auth-node@0.2.8 - - @backstage/plugin-azure-devops-backend@0.3.18 - - @backstage/plugin-azure-sites-backend@0.1.1 - - @backstage/plugin-badges-backend@0.1.34-next.0 - - @backstage/plugin-catalog-node@1.3.1-next.0 - - @backstage/plugin-events-backend@0.2.0 - - @backstage/plugin-events-node@0.2.0 - - @backstage/plugin-graphql-backend@0.1.30-next.0 - - @backstage/plugin-jenkins-backend@0.1.30-next.0 - - @backstage/plugin-kafka-backend@0.2.33-next.0 - - @backstage/plugin-kubernetes-backend@0.9.1-next.0 - - @backstage/plugin-permission-backend@0.5.14 - - @backstage/plugin-permission-common@0.7.2 - - @backstage/plugin-permission-node@0.7.2 - - @backstage/plugin-playlist-backend@0.2.3-next.0 - - @backstage/plugin-proxy-backend@0.2.33 - - @backstage/plugin-rollbar-backend@0.1.36 - - @backstage/plugin-search-backend-module-pg@0.5.1-next.0 - - @backstage/plugin-search-common@1.2.0 - - @backstage/plugin-tech-insights-backend@0.5.6-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23 - - @backstage/plugin-tech-insights-node@0.3.7 - - @backstage/plugin-techdocs-backend@1.5.1-next.0 - - @backstage/plugin-todo-backend@0.1.37-next.0 -## 0.2.78 +## 0.0.6 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.9.0 - - @backstage/plugin-azure-devops-backend@0.3.18 - - @backstage/plugin-kubernetes-backend@0.9.0 - @backstage/plugin-catalog-backend@1.6.0 - - @backstage/catalog-client@1.2.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.7 - - @backstage/plugin-search-backend@1.2.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.0 - - @backstage/plugin-search-backend-node@1.1.0 - - @backstage/plugin-playlist-backend@0.2.2 - - @backstage/plugin-search-backend-module-pg@0.5.0 - - @backstage/backend-common@0.17.0 - @backstage/plugin-app-backend@0.3.39 - - @backstage/plugin-catalog-node@1.3.0 - - @backstage/plugin-events-backend@0.2.0 - - @backstage/backend-tasks@0.4.0 - - @backstage/plugin-permission-backend@0.5.14 - - @backstage/plugin-permission-common@0.7.2 - - @backstage/plugin-permission-node@0.7.2 - - @backstage/plugin-kafka-backend@0.2.32 - - @backstage/plugin-jenkins-backend@0.1.29 - - @backstage/plugin-events-node@0.2.0 - - @backstage/integration@1.4.1 - - @backstage/plugin-auth-backend@0.17.2 - - @backstage/plugin-auth-node@0.2.8 - - @backstage/plugin-azure-sites-backend@0.1.1 - - @backstage/plugin-code-coverage-backend@0.2.5 - - @backstage/plugin-graphql-backend@0.1.29 - - @backstage/plugin-proxy-backend@0.2.33 - - @backstage/plugin-rollbar-backend@0.1.36 - - @backstage/plugin-techdocs-backend@1.5.0 - - @backstage/plugin-todo-backend@0.1.36 - - @backstage/plugin-explore-backend@0.0.1 - - @backstage/plugin-search-common@1.2.0 - - example-app@0.2.78 - - @backstage/plugin-badges-backend@0.1.33 - - @backstage/plugin-tech-insights-backend@0.5.5 - - @backstage/catalog-model@1.1.4 - - @backstage/config@1.0.5 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23 - - @backstage/plugin-tech-insights-node@0.3.7 + - @backstage/backend-defaults@0.1.4 -## 0.2.78-next.4 +## 0.0.6-next.3 ### Patch Changes - Updated dependencies - @backstage/plugin-catalog-backend@1.6.0-next.3 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.3 - @backstage/plugin-scaffolder-backend@1.9.0-next.3 - - @backstage/backend-tasks@0.4.0-next.3 - - @backstage/plugin-permission-backend@0.5.14-next.3 - - @backstage/plugin-permission-common@0.7.2-next.2 - - @backstage/plugin-permission-node@0.7.2-next.3 - - @backstage/plugin-playlist-backend@0.2.2-next.4 - - @backstage/plugin-search-backend@1.2.0-next.3 - - @backstage/plugin-kubernetes-backend@0.8.1-next.4 - - @backstage/backend-common@0.17.0-next.3 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.0-next.3 - - @backstage/plugin-techdocs-backend@1.5.0-next.3 - - example-app@0.2.78-next.4 - - @backstage/catalog-client@1.2.0-next.1 - - @backstage/catalog-model@1.1.4-next.1 - - @backstage/config@1.0.5-next.1 - - @backstage/integration@1.4.1-next.1 + - @backstage/backend-defaults@0.1.4-next.3 - @backstage/plugin-app-backend@0.3.39-next.3 - - @backstage/plugin-auth-backend@0.17.2-next.3 - - @backstage/plugin-auth-node@0.2.8-next.3 - - @backstage/plugin-azure-devops-backend@0.3.18-next.3 - - @backstage/plugin-azure-sites-backend@0.1.1-next.3 - - @backstage/plugin-badges-backend@0.1.33-next.3 - - @backstage/plugin-catalog-node@1.3.0-next.3 - - @backstage/plugin-code-coverage-backend@0.2.5-next.3 - - @backstage/plugin-events-backend@0.2.0-next.3 - - @backstage/plugin-events-node@0.2.0-next.3 - - @backstage/plugin-explore-backend@0.0.1-next.2 - - @backstage/plugin-graphql-backend@0.1.29-next.3 - - @backstage/plugin-jenkins-backend@0.1.29-next.3 - - @backstage/plugin-kafka-backend@0.2.32-next.3 - - @backstage/plugin-proxy-backend@0.2.33-next.3 - - @backstage/plugin-rollbar-backend@0.1.36-next.3 - - @backstage/plugin-search-backend-module-pg@0.4.3-next.3 - - @backstage/plugin-search-backend-node@1.1.0-next.3 - - @backstage/plugin-search-common@1.2.0-next.3 - - @backstage/plugin-tech-insights-backend@0.5.5-next.3 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.3 - - @backstage/plugin-tech-insights-node@0.3.7-next.3 - - @backstage/plugin-todo-backend@0.1.36-next.3 -## 0.2.78-next.3 +## 0.0.6-next.2 ### Patch Changes - Updated dependencies - - example-app@0.2.78-next.3 - - @backstage/backend-common@0.17.0-next.2 - - @backstage/backend-tasks@0.4.0-next.2 - - @backstage/catalog-client@1.2.0-next.1 - - @backstage/catalog-model@1.1.4-next.1 - - @backstage/config@1.0.5-next.1 - - @backstage/integration@1.4.1-next.1 - - @backstage/plugin-app-backend@0.3.39-next.2 - - @backstage/plugin-auth-backend@0.17.2-next.2 - - @backstage/plugin-auth-node@0.2.8-next.2 - - @backstage/plugin-azure-devops-backend@0.3.18-next.2 - - @backstage/plugin-azure-sites-backend@0.1.1-next.2 - - @backstage/plugin-badges-backend@0.1.33-next.2 - @backstage/plugin-catalog-backend@1.6.0-next.2 - - @backstage/plugin-catalog-node@1.3.0-next.2 - - @backstage/plugin-code-coverage-backend@0.2.5-next.2 - - @backstage/plugin-events-backend@0.2.0-next.2 - - @backstage/plugin-events-node@0.2.0-next.2 - - @backstage/plugin-explore-backend@0.0.1-next.1 - - @backstage/plugin-graphql-backend@0.1.29-next.2 - - @backstage/plugin-jenkins-backend@0.1.29-next.2 - - @backstage/plugin-kafka-backend@0.2.32-next.2 - - @backstage/plugin-kubernetes-backend@0.8.1-next.3 - - @backstage/plugin-permission-backend@0.5.14-next.2 - - @backstage/plugin-permission-common@0.7.2-next.1 - - @backstage/plugin-permission-node@0.7.2-next.2 - - @backstage/plugin-playlist-backend@0.2.2-next.3 - - @backstage/plugin-proxy-backend@0.2.33-next.2 - - @backstage/plugin-rollbar-backend@0.1.36-next.2 - - @backstage/plugin-scaffolder-backend@1.9.0-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.2 - - @backstage/plugin-search-backend@1.2.0-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.0-next.2 - - @backstage/plugin-search-backend-module-pg@0.4.3-next.2 - - @backstage/plugin-search-backend-node@1.1.0-next.2 - - @backstage/plugin-search-common@1.2.0-next.2 - - @backstage/plugin-tech-insights-backend@0.5.5-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.2 - - @backstage/plugin-tech-insights-node@0.3.7-next.2 - - @backstage/plugin-techdocs-backend@1.4.2-next.2 - - @backstage/plugin-todo-backend@0.1.36-next.2 - -## 0.2.78-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-azure-devops-backend@0.3.18-next.2 - - @backstage/plugin-search-backend@1.2.0-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.1.0-next.2 - - @backstage/plugin-search-backend-node@1.1.0-next.2 - - @backstage/plugin-catalog-backend@1.6.0-next.2 - - @backstage/plugin-playlist-backend@0.2.2-next.2 - - @backstage/plugin-search-backend-module-pg@0.4.3-next.2 - @backstage/plugin-app-backend@0.3.39-next.2 - - @backstage/plugin-catalog-node@1.3.0-next.2 - - @backstage/plugin-events-backend@0.2.0-next.2 - @backstage/plugin-scaffolder-backend@1.9.0-next.2 - - @backstage/backend-common@0.17.0-next.2 - - @backstage/plugin-search-common@1.2.0-next.2 - - example-app@0.2.78-next.2 - - @backstage/plugin-techdocs-backend@1.4.2-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.2 - - @backstage/backend-tasks@0.4.0-next.2 - - @backstage/plugin-auth-backend@0.17.2-next.2 - - @backstage/plugin-auth-node@0.2.8-next.2 - - @backstage/plugin-azure-sites-backend@0.1.1-next.2 - - @backstage/plugin-badges-backend@0.1.33-next.2 - - @backstage/plugin-code-coverage-backend@0.2.5-next.2 - - @backstage/plugin-explore-backend@0.0.1-next.1 - - @backstage/plugin-graphql-backend@0.1.29-next.2 - - @backstage/plugin-jenkins-backend@0.1.29-next.2 - - @backstage/plugin-kafka-backend@0.2.32-next.2 - - @backstage/plugin-kubernetes-backend@0.8.1-next.2 - - @backstage/plugin-permission-backend@0.5.14-next.2 - - @backstage/plugin-permission-node@0.7.2-next.2 - - @backstage/plugin-proxy-backend@0.2.33-next.2 - - @backstage/plugin-rollbar-backend@0.1.36-next.2 - - @backstage/plugin-tech-insights-backend@0.5.5-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.2 - - @backstage/plugin-tech-insights-node@0.3.7-next.2 - - @backstage/plugin-todo-backend@0.1.36-next.2 - - @backstage/catalog-client@1.2.0-next.1 - - @backstage/catalog-model@1.1.4-next.1 - - @backstage/config@1.0.5-next.1 - - @backstage/integration@1.4.1-next.1 - - @backstage/plugin-events-node@0.2.0-next.2 - - @backstage/plugin-permission-common@0.7.2-next.1 + - @backstage/backend-defaults@0.1.4-next.2 -## 0.2.78-next.1 +## 0.0.6-next.1 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.17.0-next.1 - @backstage/plugin-catalog-backend@1.6.0-next.1 - - @backstage/plugin-kafka-backend@0.2.32-next.1 - - @backstage/backend-tasks@0.4.0-next.1 - - @backstage/plugin-search-backend-node@1.0.5-next.1 - - @backstage/plugin-jenkins-backend@0.1.29-next.1 - @backstage/plugin-scaffolder-backend@1.8.1-next.1 - - @backstage/plugin-explore-backend@0.0.1-next.0 - - @backstage/plugin-proxy-backend@0.2.33-next.1 - @backstage/plugin-app-backend@0.3.39-next.1 - - @backstage/plugin-auth-backend@0.17.2-next.1 - - @backstage/plugin-auth-node@0.2.8-next.1 - - @backstage/plugin-azure-devops-backend@0.3.18-next.1 - - @backstage/plugin-azure-sites-backend@0.1.1-next.1 - - @backstage/plugin-badges-backend@0.1.33-next.1 - - @backstage/plugin-catalog-node@1.2.2-next.1 - - @backstage/plugin-code-coverage-backend@0.2.5-next.1 - - @backstage/plugin-events-backend@0.2.0-next.1 - - @backstage/plugin-graphql-backend@0.1.29-next.1 - - @backstage/plugin-kubernetes-backend@0.8.1-next.1 - - @backstage/plugin-permission-backend@0.5.14-next.1 - - @backstage/plugin-permission-node@0.7.2-next.1 - - @backstage/plugin-playlist-backend@0.2.2-next.1 - - @backstage/plugin-rollbar-backend@0.1.36-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.1 - - @backstage/plugin-search-backend@1.1.2-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.5-next.1 - - @backstage/plugin-search-backend-module-pg@0.4.3-next.1 - - @backstage/plugin-tech-insights-backend@0.5.5-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.1 - - @backstage/plugin-tech-insights-node@0.3.7-next.1 - - @backstage/plugin-techdocs-backend@1.4.2-next.1 - - @backstage/plugin-todo-backend@0.1.36-next.1 - - example-app@0.2.78-next.1 - - @backstage/config@1.0.5-next.1 - - @backstage/integration@1.4.1-next.1 - - @backstage/catalog-client@1.2.0-next.1 - - @backstage/catalog-model@1.1.4-next.1 - - @backstage/plugin-events-node@0.2.0-next.1 - - @backstage/plugin-permission-common@0.7.2-next.1 - - @backstage/plugin-search-common@1.1.2-next.1 + - @backstage/backend-defaults@0.1.4-next.1 -## 0.2.78-next.0 +## 0.0.6-next.0 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.8.1-next.0 - - @backstage/catalog-client@1.2.0-next.0 - @backstage/plugin-catalog-backend@1.6.0-next.0 - - @backstage/plugin-events-backend@0.2.0-next.0 - - @backstage/plugin-search-backend-node@1.0.5-next.0 - - @backstage/plugin-events-node@0.2.0-next.0 - - @backstage/backend-common@0.16.1-next.0 - - @backstage/integration@1.4.1-next.0 - @backstage/plugin-app-backend@0.3.39-next.0 - - @backstage/plugin-auth-backend@0.17.2-next.0 - - @backstage/plugin-auth-node@0.2.8-next.0 - - @backstage/plugin-azure-devops-backend@0.3.18-next.0 - - @backstage/plugin-azure-sites-backend@0.1.1-next.0 - - @backstage/plugin-code-coverage-backend@0.2.5-next.0 - - @backstage/plugin-graphql-backend@0.1.29-next.0 - - @backstage/plugin-jenkins-backend@0.1.29-next.0 - - @backstage/plugin-permission-backend@0.5.14-next.0 - - @backstage/plugin-permission-common@0.7.2-next.0 - - @backstage/plugin-permission-node@0.7.2-next.0 - - @backstage/plugin-playlist-backend@0.2.2-next.0 - - @backstage/plugin-proxy-backend@0.2.33-next.0 - - @backstage/plugin-rollbar-backend@0.1.36-next.0 - - @backstage/plugin-techdocs-backend@1.4.2-next.0 - - @backstage/plugin-todo-backend@0.1.36-next.0 - - @backstage/plugin-kubernetes-backend@0.8.1-next.0 - - example-app@0.2.78-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.7-next.0 - - @backstage/plugin-badges-backend@0.1.33-next.0 - - @backstage/plugin-catalog-node@1.2.2-next.0 - - @backstage/plugin-tech-insights-backend@0.5.5-next.0 - - @backstage/backend-tasks@0.3.8-next.0 - - @backstage/catalog-model@1.1.4-next.0 - - @backstage/config@1.0.5-next.0 - - @backstage/plugin-kafka-backend@0.2.32-next.0 - - @backstage/plugin-search-backend@1.1.2-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.5-next.0 - - @backstage/plugin-search-backend-module-pg@0.4.3-next.0 - - @backstage/plugin-search-common@1.1.2-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.23-next.0 - - @backstage/plugin-tech-insights-node@0.3.7-next.0 + - @backstage/backend-defaults@0.1.4-next.0 -## 0.2.77 +## 0.0.5 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.16.0 - - @backstage/plugin-auth-backend@0.17.1 - @backstage/plugin-catalog-backend@1.5.1 - - @backstage/plugin-techdocs-backend@1.4.1 - @backstage/plugin-scaffolder-backend@1.8.0 - - @backstage/integration@1.4.0 - - @backstage/backend-tasks@0.3.7 - - @backstage/plugin-playlist-backend@0.2.1 - - @backstage/plugin-azure-devops-backend@0.3.17 - - @backstage/catalog-model@1.1.3 - - @backstage/plugin-auth-node@0.2.7 - - @backstage/plugin-permission-common@0.7.1 - - @backstage/plugin-code-coverage-backend@0.2.4 - - @backstage/plugin-events-backend@0.1.0 - - @backstage/plugin-events-node@0.1.0 - - @backstage/plugin-kubernetes-backend@0.8.0 - - @backstage/plugin-tech-insights-backend@0.5.4 - - @backstage/plugin-tech-insights-node@0.3.6 - - @backstage/plugin-azure-sites-backend@0.1.0 - - example-app@0.2.77 - @backstage/plugin-app-backend@0.3.38 - - @backstage/plugin-badges-backend@0.1.32 - - @backstage/plugin-catalog-node@1.2.1 - - @backstage/plugin-graphql-backend@0.1.28 - - @backstage/plugin-jenkins-backend@0.1.28 - - @backstage/plugin-kafka-backend@0.2.31 - - @backstage/plugin-permission-backend@0.5.13 - - @backstage/plugin-permission-node@0.7.1 - - @backstage/plugin-proxy-backend@0.2.32 - - @backstage/plugin-rollbar-backend@0.1.35 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.6 - - @backstage/plugin-search-backend@1.1.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.4 - - @backstage/plugin-search-backend-module-pg@0.4.2 - - @backstage/plugin-search-backend-node@1.0.4 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.22 - - @backstage/plugin-todo-backend@0.1.35 - - @backstage/catalog-client@1.1.2 - - @backstage/config@1.0.4 - - @backstage/plugin-search-common@1.1.1 + - @backstage/backend-defaults@0.1.3 -## 0.2.77-next.2 +## 0.0.5-next.2 ### Patch Changes - Updated dependencies - - @backstage/plugin-auth-backend@0.17.1-next.1 - - @backstage/backend-common@0.16.0-next.1 - @backstage/plugin-scaffolder-backend@1.8.0-next.2 - - @backstage/plugin-code-coverage-backend@0.2.4-next.1 - - @backstage/plugin-kubernetes-backend@0.8.0-next.1 - - @backstage/plugin-tech-insights-backend@0.5.4-next.1 - - example-app@0.2.77-next.2 - - @backstage/backend-tasks@0.3.7-next.1 - @backstage/plugin-app-backend@0.3.38-next.1 - - @backstage/plugin-auth-node@0.2.7-next.1 - - @backstage/plugin-azure-devops-backend@0.3.17-next.2 - - @backstage/plugin-azure-sites-backend@0.1.0-next.1 - - @backstage/plugin-badges-backend@0.1.32-next.1 - @backstage/plugin-catalog-backend@1.5.1-next.1 - - @backstage/plugin-graphql-backend@0.1.28-next.1 - - @backstage/plugin-jenkins-backend@0.1.28-next.1 - - @backstage/plugin-kafka-backend@0.2.31-next.1 - - @backstage/plugin-permission-backend@0.5.13-next.1 - - @backstage/plugin-permission-node@0.7.1-next.1 - - @backstage/plugin-playlist-backend@0.2.1-next.2 - - @backstage/plugin-proxy-backend@0.2.32-next.1 - - @backstage/plugin-rollbar-backend@0.1.35-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.6-next.2 - - @backstage/plugin-search-backend@1.1.1-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.4-next.1 - - @backstage/plugin-search-backend-module-pg@0.4.2-next.1 - - @backstage/plugin-search-backend-node@1.0.4-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.22-next.1 - - @backstage/plugin-tech-insights-node@0.3.6-next.1 - - @backstage/plugin-techdocs-backend@1.4.1-next.1 - - @backstage/plugin-todo-backend@0.1.35-next.1 - - @backstage/catalog-client@1.1.2-next.0 - - @backstage/catalog-model@1.1.3-next.0 - - @backstage/config@1.0.4-next.0 - - @backstage/integration@1.4.0-next.0 - - @backstage/plugin-permission-common@0.7.1-next.0 - - @backstage/plugin-search-common@1.1.1-next.0 + - @backstage/backend-defaults@0.1.3-next.1 -## 0.2.77-next.1 +## 0.0.5-next.1 ### Patch Changes - Updated dependencies - @backstage/plugin-scaffolder-backend@1.8.0-next.1 - - @backstage/plugin-playlist-backend@0.2.1-next.1 - - @backstage/plugin-azure-devops-backend@0.3.17-next.1 - - example-app@0.2.77-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.6-next.1 -## 0.2.77-next.0 +## 0.0.5-next.0 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.16.0-next.0 - @backstage/plugin-catalog-backend@1.5.1-next.0 - - @backstage/plugin-techdocs-backend@1.4.1-next.0 - @backstage/plugin-scaffolder-backend@1.8.0-next.0 - - @backstage/integration@1.4.0-next.0 - - @backstage/plugin-auth-backend@0.17.1-next.0 - - @backstage/backend-tasks@0.3.7-next.0 - - @backstage/catalog-model@1.1.3-next.0 - - @backstage/plugin-auth-node@0.2.7-next.0 - - @backstage/plugin-permission-common@0.7.1-next.0 - - @backstage/plugin-tech-insights-backend@0.5.4-next.0 - - @backstage/plugin-tech-insights-node@0.3.6-next.0 - - @backstage/plugin-azure-sites-backend@0.1.0-next.0 - - @backstage/plugin-kubernetes-backend@0.8.0-next.0 - - example-app@0.2.77-next.0 - @backstage/plugin-app-backend@0.3.38-next.0 - - @backstage/plugin-azure-devops-backend@0.3.17-next.0 - - @backstage/plugin-badges-backend@0.1.32-next.0 - - @backstage/plugin-code-coverage-backend@0.2.4-next.0 - - @backstage/plugin-graphql-backend@0.1.28-next.0 - - @backstage/plugin-jenkins-backend@0.1.28-next.0 - - @backstage/plugin-kafka-backend@0.2.31-next.0 - - @backstage/plugin-permission-backend@0.5.13-next.0 - - @backstage/plugin-permission-node@0.7.1-next.0 - - @backstage/plugin-playlist-backend@0.2.1-next.0 - - @backstage/plugin-proxy-backend@0.2.32-next.0 - - @backstage/plugin-rollbar-backend@0.1.35-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.6-next.0 - - @backstage/plugin-search-backend@1.1.1-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.4-next.0 - - @backstage/plugin-search-backend-module-pg@0.4.2-next.0 - - @backstage/plugin-search-backend-node@1.0.4-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.22-next.0 - - @backstage/plugin-todo-backend@0.1.35-next.0 - - @backstage/catalog-client@1.1.2-next.0 - - @backstage/config@1.0.4-next.0 - - @backstage/plugin-search-common@1.1.1-next.0 + - @backstage/backend-defaults@0.1.3-next.0 -## 0.2.76 +## 0.0.4 ### Patch Changes - Updated dependencies - - @backstage/catalog-model@1.1.2 - - @backstage/backend-common@0.15.2 - @backstage/plugin-catalog-backend@1.5.0 - @backstage/plugin-scaffolder-backend@1.7.0 - - @backstage/plugin-auth-node@0.2.6 - - @backstage/backend-tasks@0.3.6 - - @backstage/plugin-permission-node@0.7.0 - - @backstage/plugin-auth-backend@0.17.0 - - @backstage/plugin-permission-common@0.7.0 - - @backstage/plugin-tech-insights-backend@0.5.3 - - @backstage/plugin-search-backend@1.1.0 - - @backstage/catalog-client@1.1.1 - - @backstage/plugin-playlist-backend@0.2.0 - - @backstage/plugin-jenkins-backend@0.1.27 + - @backstage/backend-defaults@0.1.2 - @backstage/plugin-app-backend@0.3.37 - - @backstage/plugin-badges-backend@0.1.31 - - @backstage/plugin-graphql-backend@0.1.27 - - @backstage/plugin-permission-backend@0.5.12 - - @backstage/plugin-rollbar-backend@0.1.34 - - @backstage/plugin-kubernetes-backend@0.7.3 - - @backstage/plugin-search-common@1.1.0 - - @backstage/plugin-search-backend-node@1.0.3 - - @backstage/plugin-search-backend-module-pg@0.4.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.3 - - @backstage/plugin-techdocs-backend@1.4.0 - - @backstage/plugin-tech-insights-node@0.3.5 - - example-app@0.2.76 - - @backstage/plugin-code-coverage-backend@0.2.3 - - @backstage/plugin-kafka-backend@0.2.30 - - @backstage/plugin-todo-backend@0.1.34 - - @backstage/plugin-azure-devops-backend@0.3.16 - - @backstage/plugin-proxy-backend@0.2.31 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.5 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.21 - - @backstage/config@1.0.3 - - @backstage/integration@1.3.2 -## 0.2.76-next.2 +## 0.0.4-next.2 ### Patch Changes - Updated dependencies - @backstage/plugin-catalog-backend@1.5.0-next.2 - - @backstage/backend-tasks@0.3.6-next.2 - - @backstage/backend-common@0.15.2-next.2 - - @backstage/plugin-permission-common@0.7.0-next.2 - - @backstage/plugin-permission-node@0.7.0-next.2 - @backstage/plugin-scaffolder-backend@1.7.0-next.2 - - @backstage/plugin-playlist-backend@0.2.0-next.2 - - @backstage/plugin-badges-backend@0.1.31-next.2 - - @backstage/plugin-graphql-backend@0.1.27-next.2 - - @backstage/plugin-permission-backend@0.5.12-next.2 - - @backstage/plugin-rollbar-backend@0.1.34-next.2 - - @backstage/plugin-search-backend@1.1.0-next.2 - - @backstage/plugin-tech-insights-backend@0.5.3-next.2 - - @backstage/plugin-techdocs-backend@1.4.0-next.2 - - example-app@0.2.76-next.2 - - @backstage/plugin-search-backend-node@1.0.3-next.2 - - @backstage/plugin-tech-insights-node@0.3.5-next.2 - @backstage/plugin-app-backend@0.3.37-next.2 - - @backstage/plugin-auth-backend@0.17.0-next.2 - - @backstage/plugin-auth-node@0.2.6-next.2 - - @backstage/plugin-azure-devops-backend@0.3.16-next.2 - - @backstage/plugin-code-coverage-backend@0.2.3-next.2 - - @backstage/plugin-jenkins-backend@0.1.27-next.2 - - @backstage/plugin-kafka-backend@0.2.30-next.2 - - @backstage/plugin-kubernetes-backend@0.7.3-next.2 - - @backstage/plugin-proxy-backend@0.2.31-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.5-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.3-next.2 - - @backstage/plugin-search-backend-module-pg@0.4.1-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.21-next.2 - - @backstage/plugin-todo-backend@0.1.34-next.2 - - @backstage/plugin-search-common@1.1.0-next.2 - - @backstage/catalog-client@1.1.1-next.2 - - @backstage/catalog-model@1.1.2-next.2 - - @backstage/config@1.0.3-next.2 - - @backstage/integration@1.3.2-next.2 + - @backstage/backend-defaults@0.1.2-next.2 -## 0.2.76-next.1 +## 0.0.4-next.1 ### Patch Changes - Updated dependencies - - @backstage/plugin-auth-backend@0.17.0-next.1 - - @backstage/plugin-search-backend@1.1.0-next.1 - - @backstage/catalog-client@1.1.1-next.1 - - @backstage/backend-common@0.15.2-next.1 - @backstage/plugin-scaffolder-backend@1.7.0-next.1 - - @backstage/plugin-search-common@1.1.0-next.1 - - @backstage/plugin-search-backend-node@1.0.3-next.1 - - @backstage/plugin-search-backend-module-pg@0.4.1-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.3-next.1 - - @backstage/plugin-kubernetes-backend@0.7.3-next.1 - - @backstage/plugin-tech-insights-backend@0.5.3-next.1 - - example-app@0.2.76-next.1 - - @backstage/backend-tasks@0.3.6-next.1 - - @backstage/catalog-model@1.1.2-next.1 - - @backstage/config@1.0.3-next.1 - - @backstage/integration@1.3.2-next.1 + - @backstage/backend-defaults@0.1.2-next.1 - @backstage/plugin-app-backend@0.3.37-next.1 - - @backstage/plugin-auth-node@0.2.6-next.1 - - @backstage/plugin-azure-devops-backend@0.3.16-next.1 - - @backstage/plugin-badges-backend@0.1.31-next.1 - @backstage/plugin-catalog-backend@1.4.1-next.1 - - @backstage/plugin-code-coverage-backend@0.2.3-next.1 - - @backstage/plugin-graphql-backend@0.1.27-next.1 - - @backstage/plugin-jenkins-backend@0.1.27-next.1 - - @backstage/plugin-kafka-backend@0.2.30-next.1 - - @backstage/plugin-permission-backend@0.5.12-next.1 - - @backstage/plugin-permission-common@0.6.5-next.1 - - @backstage/plugin-permission-node@0.6.6-next.1 - - @backstage/plugin-playlist-backend@0.1.1-next.1 - - @backstage/plugin-proxy-backend@0.2.31-next.1 - - @backstage/plugin-rollbar-backend@0.1.34-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.5-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.21-next.1 - - @backstage/plugin-tech-insights-node@0.3.5-next.1 - - @backstage/plugin-techdocs-backend@1.3.1-next.1 - - @backstage/plugin-todo-backend@0.1.34-next.1 -## 0.2.76-next.0 +## 0.0.4-next.0 ### Patch Changes - Updated dependencies - - @backstage/catalog-model@1.1.2-next.0 - @backstage/plugin-scaffolder-backend@1.7.0-next.0 - - @backstage/plugin-auth-backend@0.17.0-next.0 + - @backstage/backend-defaults@0.1.2-next.0 - @backstage/plugin-catalog-backend@1.4.1-next.0 - - @backstage/plugin-jenkins-backend@0.1.27-next.0 - @backstage/plugin-app-backend@0.3.37-next.0 - - @backstage/plugin-tech-insights-node@0.3.5-next.0 - - example-app@0.2.76-next.0 - - @backstage/catalog-client@1.1.1-next.0 - - @backstage/plugin-badges-backend@0.1.31-next.0 - - @backstage/plugin-code-coverage-backend@0.2.3-next.0 - - @backstage/plugin-kafka-backend@0.2.30-next.0 - - @backstage/plugin-kubernetes-backend@0.7.3-next.0 - - @backstage/plugin-playlist-backend@0.1.1-next.0 - - @backstage/plugin-tech-insights-backend@0.5.3-next.0 - - @backstage/plugin-techdocs-backend@1.3.1-next.0 - - @backstage/plugin-todo-backend@0.1.34-next.0 - - @backstage/backend-common@0.15.2-next.0 - - @backstage/backend-tasks@0.3.6-next.0 - - @backstage/plugin-auth-node@0.2.6-next.0 - - @backstage/plugin-permission-node@0.6.6-next.0 - - @backstage/plugin-rollbar-backend@0.1.34-next.0 - - @backstage/plugin-search-backend-module-pg@0.4.1-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.5-next.0 - - @backstage/config@1.0.3-next.0 - - @backstage/integration@1.3.2-next.0 - - @backstage/plugin-azure-devops-backend@0.3.16-next.0 - - @backstage/plugin-graphql-backend@0.1.27-next.0 - - @backstage/plugin-permission-backend@0.5.12-next.0 - - @backstage/plugin-permission-common@0.6.5-next.0 - - @backstage/plugin-proxy-backend@0.2.31-next.0 - - @backstage/plugin-search-backend@1.0.3-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.3-next.0 - - @backstage/plugin-search-backend-node@1.0.3-next.0 - - @backstage/plugin-search-common@1.0.2-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.21-next.0 -## 0.2.75 +## 0.0.3 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.15.1 - @backstage/plugin-scaffolder-backend@1.6.0 - - @backstage/plugin-auth-node@0.2.5 - - @backstage/plugin-permission-node@0.6.5 - - @backstage/plugin-kubernetes-backend@0.7.2 - - @backstage/plugin-kafka-backend@0.2.29 - - @backstage/plugin-proxy-backend@0.2.30 - - @backstage/plugin-auth-backend@0.16.0 - - @backstage/integration@1.3.1 - @backstage/plugin-catalog-backend@1.4.0 - - @backstage/plugin-azure-devops-backend@0.3.15 - - @backstage/plugin-search-backend-node@1.0.2 - - @backstage/plugin-tech-insights-node@0.3.4 - - @backstage/backend-tasks@0.3.5 - - @backstage/plugin-techdocs-backend@1.3.0 - - @backstage/catalog-client@1.1.0 - - @backstage/catalog-model@1.1.1 - - @backstage/config@1.0.2 - - @backstage/plugin-permission-common@0.6.4 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.4 - - @backstage/plugin-search-backend-module-pg@0.4.0 - - @backstage/plugin-jenkins-backend@0.1.26 - - @backstage/plugin-playlist-backend@0.1.0 - - @backstage/plugin-app-backend@0.3.36 - - @backstage/plugin-graphql-backend@0.1.26 - - @backstage/plugin-rollbar-backend@0.1.33 - - @backstage/plugin-code-coverage-backend@0.2.2 - - @backstage/plugin-permission-backend@0.5.11 - - @backstage/plugin-todo-backend@0.1.33 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.2 - - @backstage/plugin-tech-insights-backend@0.5.2 - - @backstage/plugin-badges-backend@0.1.30 - - example-app@0.2.75 - - @backstage/plugin-search-backend@1.0.2 - - @backstage/plugin-search-common@1.0.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.20 + - @backstage/backend-defaults@0.1.1 -## 0.2.75-next.3 +## 0.0.3-next.1 ### Patch Changes - Updated dependencies - - @backstage/catalog-client@1.1.0-next.2 - - @backstage/catalog-model@1.1.1-next.0 - - @backstage/config@1.0.2-next.0 - - @backstage/integration@1.3.1-next.2 - - @backstage/plugin-permission-common@0.6.4-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.4-next.1 - - @backstage/plugin-catalog-backend@1.4.0-next.3 - - @backstage/plugin-auth-backend@0.16.0-next.3 - - @backstage/backend-common@0.15.1-next.3 - - @backstage/plugin-scaffolder-backend@1.6.0-next.3 - - @backstage/plugin-badges-backend@0.1.30-next.1 - - @backstage/plugin-code-coverage-backend@0.2.2-next.2 - - @backstage/plugin-jenkins-backend@0.1.26-next.3 - - @backstage/plugin-kubernetes-backend@0.7.2-next.3 - - @backstage/plugin-tech-insights-backend@0.5.2-next.2 - - @backstage/plugin-techdocs-backend@1.3.0-next.2 - - @backstage/plugin-todo-backend@0.1.33-next.2 - - example-app@0.2.75-next.3 - - @backstage/plugin-kafka-backend@0.2.29-next.1 - - @backstage/backend-tasks@0.3.5-next.1 - - @backstage/plugin-app-backend@0.3.36-next.3 - - @backstage/plugin-auth-node@0.2.5-next.3 - - @backstage/plugin-azure-devops-backend@0.3.15-next.2 - - @backstage/plugin-graphql-backend@0.1.26-next.3 - - @backstage/plugin-permission-backend@0.5.11-next.2 - - @backstage/plugin-permission-node@0.6.5-next.3 - - @backstage/plugin-proxy-backend@0.2.30-next.2 - - @backstage/plugin-rollbar-backend@0.1.33-next.3 - - @backstage/plugin-search-backend@1.0.2-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.2-next.2 - - @backstage/plugin-search-backend-module-pg@0.4.0-next.2 - - @backstage/plugin-search-backend-node@1.0.2-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.20-next.1 - - @backstage/plugin-tech-insights-node@0.3.4-next.1 - -## 0.2.75-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.7.2-next.2 - - @backstage/backend-common@0.15.1-next.2 - - @backstage/integration@1.3.1-next.1 - - @backstage/plugin-catalog-backend@1.4.0-next.2 - - @backstage/plugin-scaffolder-backend@1.6.0-next.2 - - @backstage/plugin-auth-node@0.2.5-next.2 - - @backstage/plugin-techdocs-backend@1.3.0-next.1 - - @backstage/plugin-jenkins-backend@0.1.26-next.2 - - @backstage/catalog-client@1.0.5-next.1 - - @backstage/plugin-app-backend@0.3.36-next.2 - - @backstage/plugin-auth-backend@0.16.0-next.2 - - @backstage/plugin-azure-devops-backend@0.3.15-next.1 - - @backstage/plugin-code-coverage-backend@0.2.2-next.1 - - @backstage/plugin-graphql-backend@0.1.26-next.2 - - @backstage/plugin-permission-backend@0.5.11-next.1 - - @backstage/plugin-permission-common@0.6.4-next.1 - - @backstage/plugin-permission-node@0.6.5-next.2 - - @backstage/plugin-proxy-backend@0.2.30-next.1 - - @backstage/plugin-rollbar-backend@0.1.33-next.2 - - @backstage/plugin-todo-backend@0.1.33-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.2-next.1 - - example-app@0.2.75-next.2 - -## 0.2.75-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-node@0.2.5-next.1 - - @backstage/plugin-permission-node@0.6.5-next.1 - - @backstage/backend-common@0.15.1-next.1 - @backstage/plugin-catalog-backend@1.4.0-next.1 - - @backstage/plugin-auth-backend@0.16.0-next.1 - @backstage/plugin-scaffolder-backend@1.6.0-next.1 - - @backstage/plugin-search-backend-node@1.0.2-next.1 - - @backstage/plugin-app-backend@0.3.36-next.1 - - @backstage/plugin-graphql-backend@0.1.26-next.1 - - @backstage/plugin-jenkins-backend@0.1.26-next.1 - - @backstage/plugin-rollbar-backend@0.1.33-next.1 - - @backstage/plugin-search-backend-module-pg@0.4.0-next.1 - - @backstage/plugin-kubernetes-backend@0.7.2-next.1 - - @backstage/plugin-tech-insights-backend@0.5.2-next.1 - - example-app@0.2.75-next.1 -## 0.2.75-next.0 +## 0.0.3-next.0 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.15.1-next.0 - @backstage/plugin-scaffolder-backend@1.6.0-next.0 - - @backstage/plugin-kafka-backend@0.2.29-next.0 - - @backstage/plugin-proxy-backend@0.2.30-next.0 - - @backstage/plugin-azure-devops-backend@0.3.15-next.0 - - @backstage/plugin-search-backend-node@1.0.2-next.0 - - @backstage/plugin-tech-insights-node@0.3.4-next.0 - - @backstage/backend-tasks@0.3.5-next.0 - @backstage/plugin-catalog-backend@1.3.2-next.0 - - @backstage/plugin-search-backend-module-pg@0.4.0-next.0 - - @backstage/catalog-client@1.0.5-next.0 - - @backstage/integration@1.3.1-next.0 - - @backstage/plugin-app-backend@0.3.36-next.0 - - @backstage/plugin-auth-backend@0.15.2-next.0 - - @backstage/plugin-auth-node@0.2.5-next.0 - - @backstage/plugin-code-coverage-backend@0.2.2-next.0 - - @backstage/plugin-graphql-backend@0.1.26-next.0 - - @backstage/plugin-jenkins-backend@0.1.26-next.0 - - @backstage/plugin-permission-backend@0.5.11-next.0 - - @backstage/plugin-permission-common@0.6.4-next.0 - - @backstage/plugin-permission-node@0.6.5-next.0 - - @backstage/plugin-rollbar-backend@0.1.33-next.0 - - @backstage/plugin-techdocs-backend@1.2.2-next.0 - - @backstage/plugin-todo-backend@0.1.33-next.0 - - @backstage/plugin-tech-insights-backend@0.5.2-next.0 - - @backstage/plugin-badges-backend@0.1.30-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.2-next.0 - - @backstage/plugin-kubernetes-backend@0.7.2-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.4-next.0 - - @backstage/plugin-search-backend@1.0.2-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.20-next.0 - - example-app@0.2.75-next.0 - - @backstage/plugin-search-common@1.0.1-next.0 + - @backstage/backend-defaults@0.1.1-next.0 -## 0.2.74 +## 0.0.2 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.15.0 - - @backstage/plugin-kubernetes-backend@0.7.1 - - @backstage/integration@1.3.0 - @backstage/plugin-scaffolder-backend@1.5.0 - - @backstage/plugin-auth-backend@0.15.1 - - @backstage/plugin-graphql-backend@0.1.25 - - @backstage/backend-tasks@0.3.4 - - @backstage/plugin-tech-insights-node@0.3.3 + - @backstage/backend-defaults@0.1.0 - @backstage/plugin-catalog-backend@1.3.1 - - example-app@0.2.74 - - @backstage/plugin-app-backend@0.3.35 - - @backstage/plugin-auth-node@0.2.4 - - @backstage/plugin-azure-devops-backend@0.3.14 - - @backstage/plugin-badges-backend@0.1.29 - - @backstage/plugin-code-coverage-backend@0.2.1 - - @backstage/plugin-jenkins-backend@0.1.25 - - @backstage/plugin-kafka-backend@0.2.28 - - @backstage/plugin-permission-backend@0.5.10 - - @backstage/plugin-permission-node@0.6.4 - - @backstage/plugin-proxy-backend@0.2.29 - - @backstage/plugin-rollbar-backend@0.1.32 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.3 - - @backstage/plugin-search-backend@1.0.1 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.1 - - @backstage/plugin-search-backend-module-pg@0.3.6 - - @backstage/plugin-search-backend-node@1.0.1 - - @backstage/plugin-tech-insights-backend@0.5.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.19 - - @backstage/plugin-techdocs-backend@1.2.1 - - @backstage/plugin-todo-backend@0.1.32 -## 0.2.74-next.0 +## 0.0.2-next.0 ### Patch Changes - Updated dependencies - - @backstage/backend-common@0.15.0-next.0 - - @backstage/integration@1.3.0-next.0 - @backstage/plugin-scaffolder-backend@1.5.0-next.0 - - @backstage/backend-tasks@0.3.4-next.0 - - @backstage/plugin-kubernetes-backend@0.7.1-next.0 - - @backstage/plugin-tech-insights-node@0.3.3-next.0 - - @backstage/plugin-app-backend@0.3.35-next.0 - - @backstage/plugin-auth-backend@0.15.1-next.0 - - @backstage/plugin-auth-node@0.2.4-next.0 - - @backstage/plugin-azure-devops-backend@0.3.14-next.0 - - @backstage/plugin-badges-backend@0.1.29-next.0 + - @backstage/backend-app-api@0.1.1-next.0 - @backstage/plugin-catalog-backend@1.3.1-next.0 - - @backstage/plugin-code-coverage-backend@0.2.1-next.0 - - @backstage/plugin-graphql-backend@0.1.25-next.0 - - @backstage/plugin-jenkins-backend@0.1.25-next.0 - - @backstage/plugin-kafka-backend@0.2.28-next.0 - - @backstage/plugin-permission-backend@0.5.10-next.0 - - @backstage/plugin-permission-node@0.6.4-next.0 - - @backstage/plugin-proxy-backend@0.2.29-next.0 - - @backstage/plugin-rollbar-backend@0.1.32-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.3-next.0 - - @backstage/plugin-search-backend@1.0.1-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.1-next.0 - - @backstage/plugin-search-backend-module-pg@0.3.6-next.0 - - @backstage/plugin-search-backend-node@1.0.1-next.0 - - @backstage/plugin-tech-insights-backend@0.5.1-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.19-next.0 - - @backstage/plugin-techdocs-backend@1.2.1-next.0 - - @backstage/plugin-todo-backend@0.1.32-next.0 - - example-app@0.2.74-next.0 -## 0.2.73 +## 0.0.1 ### Patch Changes - Updated dependencies - - @backstage/plugin-code-coverage-backend@0.2.0 - @backstage/plugin-catalog-backend@1.3.0 - - @backstage/plugin-tech-insights-backend@0.5.0 - - @backstage/backend-common@0.14.1 - - @backstage/catalog-model@1.1.0 - - @backstage/plugin-kubernetes-backend@0.7.0 - - @backstage/plugin-search-backend@1.0.0 - - @backstage/plugin-search-backend-node@1.0.0 - - @backstage/plugin-search-common@1.0.0 - - @backstage/plugin-search-backend-module-elasticsearch@1.0.0 - @backstage/plugin-scaffolder-backend@1.4.0 - - @backstage/plugin-auth-backend@0.15.0 - - @backstage/plugin-jenkins-backend@0.1.24 - - @backstage/plugin-proxy-backend@0.2.28 - - @backstage/plugin-search-backend-module-pg@0.3.5 - - @backstage/integration@1.2.2 - - @backstage/catalog-client@1.0.4 - - @backstage/plugin-app-backend@0.3.34 - - @backstage/plugin-auth-node@0.2.3 - - @backstage/plugin-azure-devops-backend@0.3.13 - - @backstage/plugin-graphql-backend@0.1.24 - - @backstage/plugin-permission-backend@0.5.9 - - @backstage/plugin-permission-common@0.6.3 - - @backstage/plugin-permission-node@0.6.3 - - @backstage/plugin-rollbar-backend@0.1.31 - - @backstage/plugin-techdocs-backend@1.2.0 - - @backstage/plugin-todo-backend@0.1.31 - - @backstage/backend-tasks@0.3.3 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.18 - - @backstage/plugin-tech-insights-node@0.3.2 - - @backstage/plugin-kafka-backend@0.2.27 - - @backstage/plugin-badges-backend@0.1.28 - - example-app@0.2.73 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.2 + - @backstage/backend-app-api@0.1.0 -## 0.2.73-next.3 +## 0.0.1-next.0 ### Patch Changes - Updated dependencies - - @backstage/plugin-code-coverage-backend@0.2.0-next.3 - @backstage/plugin-catalog-backend@1.3.0-next.3 - - @backstage/plugin-kubernetes-backend@0.7.0-next.3 - - @backstage/plugin-proxy-backend@0.2.28-next.1 - - @backstage/backend-common@0.14.1-next.3 - @backstage/plugin-scaffolder-backend@1.4.0-next.3 - - @backstage/catalog-client@1.0.4-next.2 - - @backstage/integration@1.2.2-next.3 - - @backstage/plugin-app-backend@0.3.34-next.3 - - @backstage/plugin-auth-backend@0.15.0-next.3 - - @backstage/plugin-auth-node@0.2.3-next.2 - - @backstage/plugin-azure-devops-backend@0.3.13-next.1 - - @backstage/plugin-graphql-backend@0.1.24-next.1 - - @backstage/plugin-jenkins-backend@0.1.24-next.3 - - @backstage/plugin-permission-backend@0.5.9-next.2 - - @backstage/plugin-permission-common@0.6.3-next.1 - - @backstage/plugin-permission-node@0.6.3-next.2 - - @backstage/plugin-rollbar-backend@0.1.31-next.1 - - @backstage/plugin-techdocs-backend@1.2.0-next.3 - - @backstage/plugin-todo-backend@0.1.31-next.2 - - @backstage/backend-tasks@0.3.3-next.3 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.18-next.2 - - @backstage/plugin-tech-insights-backend@0.5.0-next.3 - - @backstage/plugin-tech-insights-node@0.3.2-next.1 - - @backstage/catalog-model@1.1.0-next.3 - - @backstage/plugin-search-backend-module-elasticsearch@0.2.0-next.2 - - @backstage/plugin-search-backend-node@0.6.3-next.2 - - @backstage/plugin-search-backend@0.5.4-next.2 - - example-app@0.2.73-next.3 - -## 0.2.73-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.7.0-next.2 - - @backstage/plugin-tech-insights-backend@0.5.0-next.2 - - @backstage/plugin-jenkins-backend@0.1.24-next.2 - - @backstage/plugin-search-backend-module-pg@0.3.5-next.2 - - @backstage/plugin-scaffolder-backend@1.4.0-next.2 - - @backstage/plugin-auth-backend@0.15.0-next.2 - - @backstage/catalog-model@1.1.0-next.2 - - @backstage/plugin-kafka-backend@0.2.27-next.2 - - @backstage/backend-common@0.14.1-next.2 - - @backstage/backend-tasks@0.3.3-next.2 - - @backstage/plugin-app-backend@0.3.34-next.2 - - @backstage/plugin-catalog-backend@1.2.1-next.2 - - @backstage/plugin-code-coverage-backend@0.1.32-next.2 - - @backstage/plugin-techdocs-backend@1.2.0-next.2 - - @backstage/plugin-badges-backend@0.1.28-next.2 - - @backstage/integration@1.2.2-next.2 - - example-app@0.2.73-next.2 - -## 0.2.73-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.4.0-next.1 - - @backstage/plugin-auth-backend@0.15.0-next.1 - - @backstage/catalog-model@1.1.0-next.1 - - @backstage/backend-common@0.14.1-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@0.2.0-next.1 - - @backstage/plugin-catalog-backend@1.2.1-next.1 - - @backstage/plugin-techdocs-backend@1.2.0-next.1 - - example-app@0.2.73-next.1 - - @backstage/backend-tasks@0.3.3-next.1 - - @backstage/catalog-client@1.0.4-next.1 - - @backstage/integration@1.2.2-next.1 - - @backstage/plugin-app-backend@0.3.34-next.1 - - @backstage/plugin-auth-node@0.2.3-next.1 - - @backstage/plugin-badges-backend@0.1.28-next.1 - - @backstage/plugin-code-coverage-backend@0.1.32-next.1 - - @backstage/plugin-jenkins-backend@0.1.24-next.1 - - @backstage/plugin-kafka-backend@0.2.27-next.1 - - @backstage/plugin-kubernetes-backend@0.7.0-next.1 - - @backstage/plugin-permission-backend@0.5.9-next.1 - - @backstage/plugin-permission-common@0.6.3-next.0 - - @backstage/plugin-permission-node@0.6.3-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.2-next.1 - - @backstage/plugin-search-backend@0.5.4-next.1 - - @backstage/plugin-search-backend-module-pg@0.3.5-next.1 - - @backstage/plugin-search-backend-node@0.6.3-next.1 - - @backstage/plugin-tech-insights-backend@0.4.2-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.18-next.1 - - @backstage/plugin-todo-backend@0.1.31-next.1 - -## 0.2.73-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-tech-insights-backend@0.4.2-next.0 - - @backstage/backend-common@0.14.1-next.0 - - @backstage/catalog-model@1.1.0-next.0 - - @backstage/plugin-scaffolder-backend@1.4.0-next.0 - - @backstage/plugin-auth-backend@0.14.2-next.0 - - @backstage/plugin-kubernetes-backend@0.7.0-next.0 - - @backstage/integration@1.2.2-next.0 - - @backstage/plugin-azure-devops-backend@0.3.13-next.0 - - example-app@0.2.73-next.0 - - @backstage/backend-tasks@0.3.3-next.0 - - @backstage/plugin-app-backend@0.3.34-next.0 - - @backstage/plugin-auth-node@0.2.3-next.0 - - @backstage/plugin-badges-backend@0.1.28-next.0 - - @backstage/plugin-catalog-backend@1.2.1-next.0 - - @backstage/plugin-code-coverage-backend@0.1.32-next.0 - - @backstage/plugin-graphql-backend@0.1.24-next.0 - - @backstage/plugin-jenkins-backend@0.1.24-next.0 - - @backstage/plugin-kafka-backend@0.2.27-next.0 - - @backstage/plugin-permission-backend@0.5.9-next.0 - - @backstage/plugin-permission-node@0.6.3-next.0 - - @backstage/plugin-proxy-backend@0.2.28-next.0 - - @backstage/plugin-rollbar-backend@0.1.31-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.2-next.0 - - @backstage/plugin-search-backend@0.5.4-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.6-next.0 - - @backstage/plugin-search-backend-module-pg@0.3.5-next.0 - - @backstage/plugin-search-backend-node@0.6.3-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.18-next.0 - - @backstage/plugin-tech-insights-node@0.3.2-next.0 - - @backstage/plugin-techdocs-backend@1.1.3-next.0 - - @backstage/plugin-todo-backend@0.1.31-next.0 - - @backstage/catalog-client@1.0.4-next.0 - -## 0.2.72 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-tech-insights-backend@0.4.1 - - @backstage/plugin-catalog-backend@1.2.0 - - @backstage/plugin-auth-backend@0.14.1 - - @backstage/plugin-scaffolder-backend@1.3.0 - - @backstage/backend-tasks@0.3.2 - - @backstage/plugin-permission-node@0.6.2 - - @backstage/plugin-kubernetes-backend@0.6.0 - - @backstage/backend-common@0.14.0 - - @backstage/plugin-search-backend@0.5.3 - - @backstage/plugin-auth-node@0.2.2 - - @backstage/integration@1.2.1 - - @backstage/plugin-jenkins-backend@0.1.23 - - @backstage/plugin-search-backend-node@0.6.2 - - @backstage/catalog-client@1.0.3 - - @backstage/plugin-app-backend@0.3.33 - - @backstage/plugin-azure-devops-backend@0.3.12 - - @backstage/plugin-code-coverage-backend@0.1.31 - - @backstage/plugin-graphql-backend@0.1.23 - - @backstage/plugin-permission-backend@0.5.8 - - @backstage/plugin-permission-common@0.6.2 - - @backstage/plugin-rollbar-backend@0.1.30 - - @backstage/plugin-techdocs-backend@1.1.2 - - @backstage/plugin-todo-backend@0.1.30 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.5 - - @backstage/plugin-search-backend-module-pg@0.3.4 - - @backstage/catalog-model@1.0.3 - - @backstage/plugin-tech-insights-node@0.3.1 - - example-app@0.2.72 - - @backstage/plugin-badges-backend@0.1.27 - - @backstage/plugin-kafka-backend@0.2.26 - - @backstage/plugin-proxy-backend@0.2.27 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17 - -## 0.2.72-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@1.3.0-next.2 - - @backstage/backend-common@0.14.0-next.2 - - @backstage/plugin-search-backend@0.5.3-next.2 - - @backstage/plugin-auth-backend@0.14.1-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.2 - - @backstage/integration@1.2.1-next.2 - - @backstage/plugin-techdocs-backend@1.1.2-next.2 - - @backstage/plugin-search-backend-node@0.6.2-next.2 - - example-app@0.2.72-next.2 - - @backstage/backend-tasks@0.3.2-next.2 - - @backstage/plugin-app-backend@0.3.33-next.2 - - @backstage/plugin-auth-node@0.2.2-next.2 - - @backstage/plugin-azure-devops-backend@0.3.12-next.2 - - @backstage/plugin-badges-backend@0.1.27-next.2 - - @backstage/plugin-catalog-backend@1.2.0-next.2 - - @backstage/plugin-code-coverage-backend@0.1.31-next.2 - - @backstage/plugin-graphql-backend@0.1.23-next.2 - - @backstage/plugin-jenkins-backend@0.1.23-next.2 - - @backstage/plugin-kafka-backend@0.2.26-next.2 - - @backstage/plugin-kubernetes-backend@0.6.0-next.2 - - @backstage/plugin-permission-backend@0.5.8-next.2 - - @backstage/plugin-permission-node@0.6.2-next.2 - - @backstage/plugin-proxy-backend@0.2.27-next.1 - - @backstage/plugin-rollbar-backend@0.1.30-next.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.1-next.1 - - @backstage/plugin-search-backend-module-pg@0.3.4-next.2 - - @backstage/plugin-tech-insights-backend@0.4.1-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17-next.1 - - @backstage/plugin-tech-insights-node@0.3.1-next.1 - - @backstage/plugin-todo-backend@0.1.30-next.2 - -## 0.2.72-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-tech-insights-backend@0.4.1-next.1 - - @backstage/plugin-auth-backend@0.14.1-next.1 - - @backstage/plugin-jenkins-backend@0.1.23-next.1 - - @backstage/backend-tasks@0.3.2-next.1 - - @backstage/backend-common@0.13.6-next.1 - - @backstage/catalog-client@1.0.3-next.0 - - @backstage/integration@1.2.1-next.1 - - @backstage/plugin-app-backend@0.3.33-next.1 - - @backstage/plugin-auth-node@0.2.2-next.1 - - @backstage/plugin-azure-devops-backend@0.3.12-next.1 - - @backstage/plugin-catalog-backend@1.2.0-next.1 - - @backstage/plugin-code-coverage-backend@0.1.31-next.1 - - @backstage/plugin-graphql-backend@0.1.23-next.1 - - @backstage/plugin-permission-backend@0.5.8-next.1 - - @backstage/plugin-permission-common@0.6.2-next.0 - - @backstage/plugin-permission-node@0.6.2-next.1 - - @backstage/plugin-rollbar-backend@0.1.30-next.1 - - @backstage/plugin-scaffolder-backend@1.3.0-next.1 - - @backstage/plugin-techdocs-backend@1.1.2-next.1 - - @backstage/plugin-todo-backend@0.1.30-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.1 - - @backstage/plugin-search-backend-node@0.6.2-next.1 - - @backstage/catalog-model@1.0.3-next.0 - - @backstage/plugin-badges-backend@0.1.27-next.1 - - example-app@0.2.72-next.1 - - @backstage/plugin-search-backend@0.5.3-next.1 - - @backstage/plugin-kafka-backend@0.2.26-next.1 - - @backstage/plugin-kubernetes-backend@0.6.0-next.1 - - @backstage/plugin-search-backend-module-pg@0.3.4-next.1 - -## 0.2.72-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-tasks@0.3.2-next.0 - - @backstage/plugin-scaffolder-backend@1.3.0-next.0 - - @backstage/plugin-kubernetes-backend@0.6.0-next.0 - - @backstage/backend-common@0.13.6-next.0 - - @backstage/plugin-auth-backend@0.14.1-next.0 - - @backstage/integration@1.2.1-next.0 - - @backstage/plugin-search-backend-node@0.6.2-next.0 - - @backstage/plugin-catalog-backend@1.2.0-next.0 - - @backstage/plugin-auth-node@0.2.2-next.0 - - @backstage/plugin-techdocs-backend@1.1.2-next.0 - - example-app@0.2.72-next.0 - - @backstage/plugin-app-backend@0.3.33-next.0 - - @backstage/plugin-azure-devops-backend@0.3.12-next.0 - - @backstage/plugin-badges-backend@0.1.27-next.0 - - @backstage/plugin-code-coverage-backend@0.1.31-next.0 - - @backstage/plugin-graphql-backend@0.1.23-next.0 - - @backstage/plugin-jenkins-backend@0.1.23-next.0 - - @backstage/plugin-kafka-backend@0.2.26-next.0 - - @backstage/plugin-permission-backend@0.5.8-next.0 - - @backstage/plugin-permission-node@0.6.2-next.0 - - @backstage/plugin-proxy-backend@0.2.27-next.0 - - @backstage/plugin-rollbar-backend@0.1.30-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.1-next.0 - - @backstage/plugin-search-backend@0.5.3-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.0 - - @backstage/plugin-search-backend-module-pg@0.3.4-next.0 - - @backstage/plugin-tech-insights-backend@0.4.1-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17-next.0 - - @backstage/plugin-tech-insights-node@0.3.1-next.0 - - @backstage/plugin-todo-backend@0.1.30-next.0 - -## 0.2.71 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.13.3 - - @backstage/plugin-auth-backend@0.14.0 - - @backstage/plugin-kubernetes-backend@0.5.1 - - @backstage/plugin-catalog-backend@1.1.2 - - @backstage/plugin-tech-insights-backend@0.4.0 - - @backstage/plugin-scaffolder-backend@1.2.0 - - @backstage/backend-tasks@0.3.1 - - @backstage/integration@1.2.0 - - @backstage/plugin-tech-insights-node@0.3.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16 - - @backstage/plugin-rollbar-backend@0.1.29 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.4 - - @backstage/config@1.0.1 - - @backstage/plugin-app-backend@0.3.32 - - @backstage/plugin-techdocs-backend@1.1.1 - - @backstage/plugin-search-backend-node@0.6.1 - - @backstage/plugin-search-backend-module-pg@0.3.3 - - @backstage/plugin-jenkins-backend@0.1.22 - - @backstage/plugin-search-backend@0.5.2 - - @backstage/plugin-auth-node@0.2.1 - - @backstage/plugin-azure-devops-backend@0.3.11 - - example-app@0.2.71 - - @backstage/catalog-client@1.0.2 - - @backstage/catalog-model@1.0.2 - - @backstage/plugin-badges-backend@0.1.26 - - @backstage/plugin-code-coverage-backend@0.1.30 - - @backstage/plugin-graphql-backend@0.1.22 - - @backstage/plugin-kafka-backend@0.2.25 - - @backstage/plugin-permission-backend@0.5.7 - - @backstage/plugin-permission-common@0.6.1 - - @backstage/plugin-permission-node@0.6.1 - - @backstage/plugin-proxy-backend@0.2.26 - - @backstage/plugin-todo-backend@0.1.29 - -## 0.2.71-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.13.3-next.2 - - @backstage/plugin-kubernetes-backend@0.5.1-next.1 - - @backstage/plugin-catalog-backend@1.1.2-next.2 - - @backstage/backend-tasks@0.3.1-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.4.0-next.1 - - @backstage/plugin-scaffolder-backend@1.2.0-next.1 - - @backstage/config@1.0.1-next.0 - - @backstage/plugin-search-backend-node@0.6.1-next.1 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.4-next.1 - - @backstage/plugin-search-backend-module-pg@0.3.3-next.1 - - @backstage/plugin-azure-devops-backend@0.3.11-next.1 - - example-app@0.2.71-next.2 - - @backstage/catalog-model@1.0.2-next.0 - - @backstage/integration@1.2.0-next.1 - - @backstage/plugin-app-backend@0.3.32-next.1 - - @backstage/plugin-auth-backend@0.13.1-next.2 - - @backstage/plugin-auth-node@0.2.1-next.1 - - @backstage/plugin-badges-backend@0.1.26-next.1 - - @backstage/plugin-code-coverage-backend@0.1.30-next.1 - - @backstage/plugin-graphql-backend@0.1.22-next.1 - - @backstage/plugin-jenkins-backend@0.1.22-next.1 - - @backstage/plugin-kafka-backend@0.2.25-next.1 - - @backstage/plugin-permission-backend@0.5.7-next.1 - - @backstage/plugin-permission-common@0.6.1-next.0 - - @backstage/plugin-permission-node@0.6.1-next.1 - - @backstage/plugin-proxy-backend@0.2.26-next.1 - - @backstage/plugin-rollbar-backend@0.1.29-next.2 - - @backstage/plugin-search-backend@0.5.2-next.1 - - @backstage/plugin-tech-insights-backend@0.4.0-next.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16-next.2 - - @backstage/plugin-tech-insights-node@0.3.0-next.2 - - @backstage/plugin-techdocs-backend@1.1.1-next.1 - - @backstage/plugin-todo-backend@0.1.29-next.1 - - @backstage/catalog-client@1.0.2-next.0 - -## 0.2.71-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.13.1-next.1 - - @backstage/plugin-tech-insights-backend@0.4.0-next.1 - - @backstage/backend-common@0.13.3-next.1 - - @backstage/plugin-tech-insights-node@0.3.0-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16-next.1 - - @backstage/plugin-catalog-backend@1.1.2-next.1 - - @backstage/plugin-rollbar-backend@0.1.29-next.1 - - example-app@0.2.71-next.1 - -## 0.2.71-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.13.3-next.0 - - @backstage/plugin-scaffolder-backend@1.2.0-next.0 - - @backstage/plugin-kubernetes-backend@0.5.1-next.0 - - @backstage/integration@1.2.0-next.0 - - @backstage/plugin-catalog-backend@1.1.2-next.0 - - @backstage/plugin-app-backend@0.3.32-next.0 - - @backstage/plugin-auth-backend@0.13.1-next.0 - - @backstage/plugin-rollbar-backend@0.1.29-next.0 - - @backstage/plugin-techdocs-backend@1.1.1-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.4-next.0 - - @backstage/plugin-jenkins-backend@0.1.22-next.0 - - @backstage/plugin-search-backend@0.5.2-next.0 - - @backstage/backend-tasks@0.3.1-next.0 - - @backstage/plugin-auth-node@0.2.1-next.0 - - example-app@0.2.71-next.0 - - @backstage/plugin-azure-devops-backend@0.3.11-next.0 - - @backstage/plugin-badges-backend@0.1.26-next.0 - - @backstage/plugin-code-coverage-backend@0.1.30-next.0 - - @backstage/plugin-graphql-backend@0.1.22-next.0 - - @backstage/plugin-kafka-backend@0.2.25-next.0 - - @backstage/plugin-permission-backend@0.5.7-next.0 - - @backstage/plugin-permission-node@0.6.1-next.0 - - @backstage/plugin-proxy-backend@0.2.26-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.3.7-next.0 - - @backstage/plugin-search-backend-module-pg@0.3.3-next.0 - - @backstage/plugin-search-backend-node@0.6.1-next.0 - - @backstage/plugin-tech-insights-backend@0.3.1-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.16-next.0 - - @backstage/plugin-tech-insights-node@0.2.10-next.0 - - @backstage/plugin-todo-backend@0.1.29-next.0 - -## 0.2.70 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.1.0 - - @backstage/plugin-techdocs-backend@1.1.0 - - @backstage/plugin-scaffolder-backend@1.1.0 - - @backstage/integration@1.1.0 - - @backstage/plugin-search-backend@0.5.0 - - @backstage/plugin-auth-backend@0.13.0 - - @backstage/backend-tasks@0.3.0 - - @backstage/plugin-permission-common@0.6.0 - - @backstage/plugin-permission-node@0.6.0 - - @backstage/catalog-model@1.0.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.15 - - @backstage/plugin-kafka-backend@0.2.24 - - @backstage/plugin-auth-node@0.2.0 - - @backstage/plugin-jenkins-backend@0.1.20 - - @backstage/plugin-badges-backend@0.1.25 - - @backstage/plugin-tech-insights-node@0.2.9 - - @backstage/plugin-todo-backend@0.1.28 - - @backstage/backend-common@0.13.2 - - @backstage/plugin-kubernetes-backend@0.5.0 - - @backstage/plugin-search-backend-node@0.6.0 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.3 - - @backstage/plugin-search-backend-module-pg@0.3.2 - - @backstage/plugin-permission-backend@0.5.6 - - @backstage/plugin-tech-insights-backend@0.3.0 - - @backstage/plugin-azure-devops-backend@0.3.10 - - @backstage/plugin-scaffolder-backend-module-rails@0.3.6 - - example-app@0.2.70 - - @backstage/catalog-client@1.0.1 - - @backstage/plugin-app-backend@0.3.31 - - @backstage/plugin-code-coverage-backend@0.1.29 - - @backstage/plugin-graphql-backend@0.1.21 - - @backstage/plugin-proxy-backend@0.2.25 - - @backstage/plugin-rollbar-backend@0.1.28 - -## 0.2.70-next.2 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.13.0-next.2 - - @backstage/plugin-catalog-backend@1.1.0-next.3 - - @backstage/plugin-kafka-backend@0.2.24-next.1 - - @backstage/plugin-search-backend@0.5.0-next.2 - - @backstage/plugin-permission-common@0.6.0-next.1 - - @backstage/plugin-permission-node@0.6.0-next.2 - - @backstage/plugin-jenkins-backend@0.1.20-next.2 - - @backstage/plugin-todo-backend@0.1.28-next.2 - - @backstage/backend-common@0.13.2-next.2 - - @backstage/plugin-kubernetes-backend@0.5.0-next.1 - - @backstage/plugin-search-backend-node@0.6.0-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.3.6-next.2 - - @backstage/integration@1.1.0-next.2 - - @backstage/plugin-techdocs-backend@1.1.0-next.2 - - example-app@0.2.70-next.2 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.3-next.1 - - @backstage/plugin-search-backend-module-pg@0.3.2-next.1 - - @backstage/plugin-app-backend@0.3.31-next.1 - -## 0.2.70-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@1.1.0-next.1 - - @backstage/plugin-techdocs-backend@1.0.1-next.1 - - @backstage/plugin-scaffolder-backend@1.1.0-next.1 - - @backstage/integration@1.1.0-next.1 - - @backstage/plugin-search-backend@0.5.0-next.1 - - @backstage/backend-tasks@0.3.0-next.1 - - @backstage/plugin-permission-common@0.6.0-next.0 - - @backstage/plugin-permission-node@0.6.0-next.1 - - @backstage/plugin-badges-backend@0.1.25-next.1 - - @backstage/plugin-tech-insights-node@0.2.9-next.1 - - @backstage/plugin-permission-backend@0.5.6-next.1 - - @backstage/backend-common@0.13.2-next.1 - - @backstage/plugin-auth-backend@0.13.0-next.1 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.15-next.1 - - @backstage/plugin-tech-insights-backend@0.3.0-next.1 - - @backstage/plugin-jenkins-backend@0.1.20-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.3.6-next.1 - - @backstage/plugin-code-coverage-backend@0.1.29-next.1 - - @backstage/plugin-todo-backend@0.1.28-next.1 - - example-app@0.2.70-next.1 - -## 0.2.70-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@1.0.1-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.15-next.0 - - @backstage/plugin-search-backend@0.5.0-next.0 - - @backstage/plugin-auth-node@0.2.0-next.0 - - @backstage/plugin-auth-backend@0.13.0-next.0 - - @backstage/plugin-catalog-backend@1.0.1-next.0 - - @backstage/plugin-search-backend-node@0.5.3-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.3-next.0 - - @backstage/plugin-search-backend-module-pg@0.3.2-next.0 - - @backstage/backend-common@0.13.2-next.0 - - @backstage/integration@1.0.1-next.0 - - @backstage/plugin-tech-insights-backend@0.2.11-next.0 - - @backstage/plugin-techdocs-backend@1.0.1-next.0 - - @backstage/plugin-jenkins-backend@0.1.20-next.0 - - example-app@0.2.70-next.0 - - @backstage/catalog-client@1.0.1-next.0 - - @backstage/plugin-badges-backend@0.1.25-next.0 - - @backstage/plugin-code-coverage-backend@0.1.29-next.0 - - @backstage/plugin-kafka-backend@0.2.24-next.0 - - @backstage/plugin-kubernetes-backend@0.4.14-next.0 - - @backstage/plugin-scaffolder-backend@1.0.1-next.0 - - @backstage/plugin-todo-backend@0.1.28-next.0 - - @backstage/plugin-app-backend@0.3.31-next.0 - - @backstage/plugin-permission-backend@0.5.6-next.0 - - @backstage/plugin-permission-node@0.5.6-next.0 - - @backstage/backend-tasks@0.2.2-next.0 - - @backstage/plugin-azure-devops-backend@0.3.10-next.0 - - @backstage/plugin-graphql-backend@0.1.21-next.0 - - @backstage/plugin-proxy-backend@0.2.25-next.0 - - @backstage/plugin-rollbar-backend@0.1.28-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.3.6-next.0 - - @backstage/plugin-tech-insights-node@0.2.9-next.0 - -## 0.2.69 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-app-backend@0.3.30 - - @backstage/plugin-azure-devops-backend@0.3.9 - - @backstage/plugin-badges-backend@0.1.24 - - @backstage/plugin-catalog-backend@1.0.0 - - @backstage/plugin-jenkins-backend@0.1.19 - - @backstage/plugin-scaffolder-backend-module-rails@0.3.5 - - @backstage/plugin-tech-insights-backend@0.2.10 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.14 - - @backstage/plugin-todo-backend@0.1.27 - - @backstage/plugin-kubernetes-backend@0.4.13 - - @backstage/plugin-scaffolder-backend@1.0.0 - - @backstage/backend-common@0.13.1 - - @backstage/backend-tasks@0.2.1 - - @backstage/plugin-auth-backend@0.12.2 - - @backstage/plugin-code-coverage-backend@0.1.28 - - @backstage/catalog-model@1.0.0 - - @backstage/integration@1.0.0 - - @backstage/catalog-client@1.0.0 - - @backstage/config@1.0.0 - - @backstage/plugin-techdocs-backend@1.0.0 - - @backstage/plugin-permission-common@0.5.3 - - @backstage/plugin-search-backend-node@0.5.2 - - example-app@0.2.69 - - @backstage/plugin-auth-node@0.1.6 - - @backstage/plugin-graphql-backend@0.1.20 - - @backstage/plugin-kafka-backend@0.2.23 - - @backstage/plugin-permission-backend@0.5.5 - - @backstage/plugin-permission-node@0.5.5 - - @backstage/plugin-proxy-backend@0.2.24 - - @backstage/plugin-rollbar-backend@0.1.27 - - @backstage/plugin-search-backend@0.4.8 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.2 - - @backstage/plugin-tech-insights-node@0.2.8 - -## 0.2.68 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.13.0 - - @backstage/backend-tasks@0.2.0 - - @backstage/plugin-app-backend@0.3.29 - - @backstage/plugin-auth-backend@0.12.1 - - @backstage/plugin-catalog-backend@0.24.0 - - @backstage/plugin-scaffolder-backend@0.18.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.3.4 - - @backstage/plugin-kubernetes-backend@0.4.12 - - @backstage/plugin-rollbar-backend@0.1.26 - - @backstage/plugin-techdocs-backend@0.14.2 - - @backstage/catalog-model@0.13.0 - - @backstage/plugin-badges-backend@0.1.23 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.1 - - @backstage/plugin-search-backend-module-pg@0.3.1 - - @backstage/plugin-search-backend-node@0.5.1 - - @backstage/plugin-search-backend@0.4.7 - - @backstage/catalog-client@0.9.0 - - example-app@0.2.68 - - @backstage/plugin-auth-node@0.1.5 - - @backstage/plugin-azure-devops-backend@0.3.8 - - @backstage/plugin-code-coverage-backend@0.1.27 - - @backstage/plugin-graphql-backend@0.1.19 - - @backstage/plugin-jenkins-backend@0.1.18 - - @backstage/plugin-kafka-backend@0.2.22 - - @backstage/plugin-permission-backend@0.5.4 - - @backstage/plugin-permission-node@0.5.4 - - @backstage/plugin-proxy-backend@0.2.23 - - @backstage/plugin-tech-insights-backend@0.2.9 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.13 - - @backstage/plugin-tech-insights-node@0.2.7 - - @backstage/plugin-todo-backend@0.1.26 - -## 0.2.68-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.13.0-next.0 - - @backstage/backend-tasks@0.2.0-next.0 - - @backstage/plugin-app-backend@0.3.29-next.0 - - @backstage/plugin-auth-backend@0.12.1-next.0 - - @backstage/plugin-catalog-backend@0.24.0-next.0 - - @backstage/plugin-scaffolder-backend@0.18.0-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.3.4-next.0 - - @backstage/plugin-kubernetes-backend@0.4.12-next.0 - - @backstage/plugin-rollbar-backend@0.1.26-next.0 - - @backstage/plugin-techdocs-backend@0.14.2-next.0 - - @backstage/catalog-model@0.13.0-next.0 - - @backstage/plugin-badges-backend@0.1.23-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.1-next.0 - - @backstage/plugin-search-backend-module-pg@0.3.1-next.0 - - @backstage/plugin-search-backend-node@0.5.1-next.0 - - @backstage/plugin-search-backend@0.4.7-next.0 - - @backstage/catalog-client@0.9.0-next.0 - - @backstage/plugin-auth-node@0.1.5-next.0 - - @backstage/plugin-azure-devops-backend@0.3.8-next.0 - - @backstage/plugin-code-coverage-backend@0.1.27-next.0 - - @backstage/plugin-graphql-backend@0.1.19-next.0 - - @backstage/plugin-jenkins-backend@0.1.18-next.0 - - @backstage/plugin-kafka-backend@0.2.22-next.0 - - @backstage/plugin-permission-backend@0.5.4-next.0 - - @backstage/plugin-permission-node@0.5.4-next.0 - - @backstage/plugin-proxy-backend@0.2.23-next.0 - - @backstage/plugin-tech-insights-backend@0.2.9-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.13-next.0 - - @backstage/plugin-tech-insights-node@0.2.7-next.0 - - @backstage/plugin-todo-backend@0.1.26-next.0 - - example-app@0.2.68-next.0 - -## 0.2.67 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-model@0.12.0 - - @backstage/catalog-client@0.8.0 - - @backstage/plugin-catalog-backend@0.23.0 - - @backstage/backend-common@0.12.0 - - @backstage/plugin-scaffolder-backend@0.17.3 - - @backstage/plugin-techdocs-backend@0.14.1 - - @backstage/plugin-auth-backend@0.12.0 - - @backstage/plugin-badges-backend@0.1.22 - - @backstage/plugin-code-coverage-backend@0.1.26 - - @backstage/plugin-jenkins-backend@0.1.17 - - @backstage/plugin-todo-backend@0.1.25 - - @backstage/integration@0.8.0 - - @backstage/plugin-permission-common@0.5.2 - - @backstage/plugin-permission-node@0.5.3 - - @backstage/plugin-search-backend-node@0.5.0 - - @backstage/plugin-search-backend-module-pg@0.3.0 - - @backstage/plugin-search-backend-module-elasticsearch@0.1.0 - - @backstage/plugin-tech-insights-backend@0.2.8 - - example-app@0.2.67 - - @backstage/plugin-auth-node@0.1.4 - - @backstage/plugin-kafka-backend@0.2.21 - - @backstage/plugin-kubernetes-backend@0.4.11 - - @backstage/backend-tasks@0.1.10 - - @backstage/plugin-app-backend@0.3.28 - - @backstage/plugin-azure-devops-backend@0.3.7 - - @backstage/plugin-graphql-backend@0.1.18 - - @backstage/plugin-permission-backend@0.5.3 - - @backstage/plugin-proxy-backend@0.2.22 - - @backstage/plugin-rollbar-backend@0.1.25 - - @backstage/plugin-scaffolder-backend-module-rails@0.3.3 - - @backstage/plugin-search-backend@0.4.6 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.12 - - @backstage/plugin-tech-insights-node@0.2.6 - -## 0.2.66 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.11.0 - - @backstage/plugin-catalog-backend@0.22.0 - - @backstage/plugin-scaffolder-backend@0.17.0 - - @backstage/plugin-graphql-backend@0.1.17 - - @backstage/plugin-auth-backend@0.11.0 - - @backstage/plugin-kubernetes-backend@0.4.10 - - @backstage/plugin-code-coverage-backend@0.1.25 - - @backstage/plugin-jenkins-backend@0.1.16 - - @backstage/plugin-tech-insights-backend@0.2.7 - - @backstage/plugin-todo-backend@0.1.24 - - @backstage/catalog-model@0.11.0 - - @backstage/catalog-client@0.7.2 - - @backstage/plugin-badges-backend@0.1.21 - - @backstage/backend-tasks@0.1.9 - - @backstage/plugin-scaffolder-backend-module-rails@0.3.2 - - @backstage/plugin-techdocs-backend@0.14.0 - - @backstage/plugin-permission-node@0.5.2 - - @backstage/integration@0.7.5 - - example-app@0.2.66 - - @backstage/plugin-app-backend@0.3.27 - - @backstage/plugin-auth-node@0.1.3 - - @backstage/plugin-azure-devops-backend@0.3.6 - - @backstage/plugin-kafka-backend@0.2.20 - - @backstage/plugin-permission-backend@0.5.2 - - @backstage/plugin-proxy-backend@0.2.21 - - @backstage/plugin-rollbar-backend@0.1.24 - - @backstage/plugin-search-backend@0.4.5 - - @backstage/plugin-search-backend-module-pg@0.2.9 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.11 - - @backstage/plugin-tech-insights-node@0.2.5 - -## 0.2.66 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.10.9 - - @backstage/backend-tasks@0.1.8 - - @backstage/catalog-client@0.7.1 - - @backstage/catalog-model@0.10.1 - - @backstage/config@0.1.15 - - @backstage/integration@0.7.4 - - @backstage/plugin-app-backend@0.3.26 - - @backstage/plugin-auth-backend@0.10.2 - - @backstage/plugin-auth-node@0.1.2 - - @backstage/plugin-azure-devops-backend@0.3.5 - - @backstage/plugin-badges-backend@0.1.20 - - @backstage/plugin-catalog-backend@0.21.5 - - @backstage/plugin-code-coverage-backend@0.1.24 - - @backstage/plugin-graphql-backend@0.1.16 - - @backstage/plugin-jenkins-backend@0.1.15 - - @backstage/plugin-kafka-backend@0.2.19 - - @backstage/plugin-kubernetes-backend@0.4.9 - - @backstage/plugin-permission-backend@0.5.1 - - @backstage/plugin-permission-common@0.5.1 - - @backstage/plugin-permission-node@0.5.1 - - @backstage/plugin-proxy-backend@0.2.20 - - @backstage/plugin-rollbar-backend@0.1.23 - - @backstage/plugin-scaffolder-backend@0.16.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.3.1 - - @backstage/plugin-search-backend@0.4.4 - - @backstage/plugin-search-backend-module-elasticsearch@0.0.10 - - @backstage/plugin-search-backend-module-pg@0.2.8 - - @backstage/plugin-search-backend-node@0.4.7 - - @backstage/plugin-tech-insights-backend@0.2.6 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.10 - - @backstage/plugin-tech-insights-node@0.2.4 - - @backstage/plugin-techdocs-backend@0.13.5 - - @backstage/plugin-todo-backend@0.1.23 - -## 0.2.65 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-techdocs-backend@0.13.4 - - @backstage/plugin-catalog-backend@0.21.4 - - @backstage/backend-common@0.10.8 - - @backstage/catalog-client@0.7.0 - - @backstage/integration@0.7.3 - - @backstage/plugin-auth-backend@0.10.1 - - @backstage/plugin-auth-node@0.1.1 - - @backstage/plugin-permission-backend@0.5.0 - - @backstage/plugin-permission-common@0.5.0 - - @backstage/plugin-rollbar-backend@0.1.22 - - @backstage/plugin-scaffolder-backend@0.16.0 - - @backstage/backend-tasks@0.1.7 - - @backstage/catalog-model@0.10.0 - - @backstage/config@0.1.14 - - @backstage/plugin-app-backend@0.3.25 - - @backstage/plugin-azure-devops-backend@0.3.4 - - @backstage/plugin-badges-backend@0.1.19 - - @backstage/plugin-code-coverage-backend@0.1.23 - - @backstage/plugin-graphql-backend@0.1.15 - - @backstage/plugin-jenkins-backend@0.1.14 - - @backstage/plugin-kafka-backend@0.2.18 - - @backstage/plugin-kubernetes-backend@0.4.8 - - @backstage/plugin-permission-node@0.5.0 - - @backstage/plugin-proxy-backend@0.2.19 - - @backstage/plugin-scaffolder-backend-module-rails@0.3.0 - - @backstage/plugin-search-backend@0.4.3 - - @backstage/plugin-search-backend-module-elasticsearch@0.0.9 - - @backstage/plugin-search-backend-module-pg@0.2.7 - - @backstage/plugin-search-backend-node@0.4.6 - - @backstage/plugin-tech-insights-backend@0.2.5 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.9 - - @backstage/plugin-tech-insights-node@0.2.3 - - @backstage/plugin-todo-backend@0.1.22 - - example-app@0.2.65 - -## 0.2.64 - -### Patch Changes - -- Updated dependencies - - @backstage/catalog-client@0.6.0 - - @backstage/plugin-auth-backend@0.10.0 - - @backstage/backend-common@0.10.7 - - @backstage/backend-tasks@0.1.6 - - @backstage/plugin-app-backend@0.3.24 - - @backstage/plugin-catalog-backend@0.21.3 - - @backstage/plugin-code-coverage-backend@0.1.22 - - @backstage/plugin-scaffolder-backend@0.15.24 - - @backstage/plugin-search-backend-module-pg@0.2.6 - - @backstage/plugin-tech-insights-backend@0.2.4 - - @backstage/plugin-techdocs-backend@0.13.3 - - @backstage/plugin-auth-node@0.1.0 - - @backstage/plugin-permission-backend@0.4.3 - - @backstage/plugin-search-backend@0.4.2 - - @backstage/plugin-badges-backend@0.1.18 - - @backstage/plugin-jenkins-backend@0.1.13 - - @backstage/plugin-todo-backend@0.1.21 - - @backstage/plugin-permission-node@0.4.3 - - example-app@0.2.64 - - @backstage/plugin-azure-devops-backend@0.3.3 - - @backstage/plugin-graphql-backend@0.1.14 - - @backstage/plugin-kafka-backend@0.2.17 - - @backstage/plugin-kubernetes-backend@0.4.7 - - @backstage/plugin-proxy-backend@0.2.18 - - @backstage/plugin-rollbar-backend@0.1.21 - - @backstage/plugin-scaffolder-backend-module-rails@0.2.6 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.8 - - @backstage/plugin-tech-insights-node@0.2.2 - -## 0.2.64-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.10.0-next.0 - - @backstage/backend-common@0.10.7-next.0 - - @backstage/backend-tasks@0.1.6-next.0 - - @backstage/plugin-app-backend@0.3.24-next.0 - - @backstage/plugin-catalog-backend@0.21.3-next.0 - - @backstage/plugin-code-coverage-backend@0.1.22-next.0 - - @backstage/plugin-scaffolder-backend@0.15.24-next.0 - - @backstage/plugin-search-backend-module-pg@0.2.6-next.0 - - @backstage/plugin-tech-insights-backend@0.2.4-next.0 - - @backstage/plugin-techdocs-backend@0.13.3-next.0 - - example-app@0.2.64-next.0 - - @backstage/plugin-azure-devops-backend@0.3.3-next.0 - - @backstage/plugin-badges-backend@0.1.18-next.0 - - @backstage/plugin-graphql-backend@0.1.14-next.0 - - @backstage/plugin-jenkins-backend@0.1.13-next.0 - - @backstage/plugin-kafka-backend@0.2.17-next.0 - - @backstage/plugin-kubernetes-backend@0.4.7-next.0 - - @backstage/plugin-permission-backend@0.4.3-next.0 - - @backstage/plugin-permission-node@0.4.3-next.0 - - @backstage/plugin-proxy-backend@0.2.18-next.0 - - @backstage/plugin-rollbar-backend@0.1.21-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.2.6-next.0 - - @backstage/plugin-search-backend@0.4.2-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.8-next.0 - - @backstage/plugin-tech-insights-node@0.2.2-next.0 - - @backstage/plugin-todo-backend@0.1.21-next.0 - -## 0.2.63 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.9.0 - - @backstage/plugin-rollbar-backend@0.1.20 - - @backstage/plugin-catalog-backend@0.21.2 - - @backstage/plugin-scaffolder-backend@0.15.23 - - @backstage/plugin-proxy-backend@0.2.17 - - @backstage/backend-common@0.10.6 - - example-app@0.2.63 - - @backstage/backend-tasks@0.1.5 - - @backstage/plugin-app-backend@0.3.23 - - @backstage/plugin-azure-devops-backend@0.3.2 - - @backstage/plugin-badges-backend@0.1.17 - - @backstage/plugin-code-coverage-backend@0.1.21 - - @backstage/plugin-graphql-backend@0.1.13 - - @backstage/plugin-jenkins-backend@0.1.12 - - @backstage/plugin-kafka-backend@0.2.16 - - @backstage/plugin-kubernetes-backend@0.4.6 - - @backstage/plugin-permission-backend@0.4.2 - - @backstage/plugin-permission-node@0.4.2 - - @backstage/plugin-scaffolder-backend-module-rails@0.2.5 - - @backstage/plugin-search-backend@0.4.1 - - @backstage/plugin-search-backend-module-pg@0.2.5 - - @backstage/plugin-tech-insights-backend@0.2.3 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.7 - - @backstage/plugin-tech-insights-node@0.2.1 - - @backstage/plugin-techdocs-backend@0.13.2 - - @backstage/plugin-todo-backend@0.1.20 - -## 0.2.63-next.1 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.9.0-next.1 - - @backstage/backend-common@0.10.6-next.0 - - example-app@0.2.63-next.1 - - @backstage/plugin-catalog-backend@0.21.2-next.1 - - @backstage/plugin-techdocs-backend@0.13.2-next.0 - - @backstage/backend-tasks@0.1.5-next.0 - - @backstage/plugin-app-backend@0.3.23-next.0 - - @backstage/plugin-azure-devops-backend@0.3.2-next.0 - - @backstage/plugin-badges-backend@0.1.17-next.0 - - @backstage/plugin-code-coverage-backend@0.1.21-next.0 - - @backstage/plugin-graphql-backend@0.1.13-next.0 - - @backstage/plugin-jenkins-backend@0.1.12-next.0 - - @backstage/plugin-kafka-backend@0.2.16-next.0 - - @backstage/plugin-kubernetes-backend@0.4.6-next.0 - - @backstage/plugin-permission-backend@0.4.2-next.1 - - @backstage/plugin-permission-node@0.4.2-next.1 - - @backstage/plugin-proxy-backend@0.2.17-next.1 - - @backstage/plugin-rollbar-backend@0.1.20-next.1 - - @backstage/plugin-scaffolder-backend@0.15.23-next.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.2.5-next.1 - - @backstage/plugin-search-backend@0.4.1-next.1 - - @backstage/plugin-search-backend-module-pg@0.2.5-next.0 - - @backstage/plugin-tech-insights-backend@0.2.3-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.7-next.0 - - @backstage/plugin-tech-insights-node@0.2.1-next.0 - - @backstage/plugin-todo-backend@0.1.20-next.0 - -## 0.2.63-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.9.0-next.0 - - @backstage/plugin-rollbar-backend@0.1.20-next.0 - - @backstage/plugin-catalog-backend@0.21.2-next.0 - - @backstage/plugin-scaffolder-backend@0.15.23-next.0 - - @backstage/plugin-proxy-backend@0.2.17-next.0 - - @backstage/plugin-permission-backend@0.4.2-next.0 - - @backstage/plugin-permission-node@0.4.2-next.0 - - @backstage/plugin-search-backend@0.4.1-next.0 - - example-app@0.2.63-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.2.5-next.0 - -## 0.2.62 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend-node@0.4.5 - - @backstage/plugin-catalog-backend@0.21.1 - - @backstage/plugin-scaffolder-backend@0.15.22 - - @backstage/plugin-kubernetes-backend@0.4.5 - - @backstage/plugin-auth-backend@0.8.0 - - @backstage/plugin-search-backend@0.4.0 - - @backstage/plugin-tech-insights-backend@0.2.2 - - @backstage/plugin-techdocs-backend@0.13.1 - - @backstage/backend-common@0.10.5 - - example-app@0.2.62 - - @backstage/plugin-permission-backend@0.4.1 - - @backstage/plugin-permission-node@0.4.1 - -## 0.2.61 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.7.0 - - @backstage/plugin-permission-backend@0.4.0 - - @backstage/plugin-catalog-backend@0.21.0 - - @backstage/plugin-kubernetes-backend@0.4.4 - - @backstage/integration@0.7.2 - - @backstage/plugin-permission-common@0.4.0 - - @backstage/plugin-search-backend@0.3.1 - - @backstage/plugin-techdocs-backend@0.13.0 - - @backstage/backend-common@0.10.4 - - @backstage/config@0.1.13 - - @backstage/plugin-app-backend@0.3.22 - - @backstage/plugin-permission-node@0.4.0 - - @backstage/plugin-scaffolder-backend@0.15.21 - - @backstage/plugin-tech-insights-backend@0.2.0 - - @backstage/plugin-tech-insights-node@0.2.0 - - @backstage/catalog-model@0.9.10 - - example-app@0.2.61 - - @backstage/backend-tasks@0.1.4 - - @backstage/catalog-client@0.5.5 - - @backstage/plugin-azure-devops-backend@0.3.1 - - @backstage/plugin-badges-backend@0.1.16 - - @backstage/plugin-code-coverage-backend@0.1.20 - - @backstage/plugin-graphql-backend@0.1.12 - - @backstage/plugin-jenkins-backend@0.1.11 - - @backstage/plugin-kafka-backend@0.2.15 - - @backstage/plugin-proxy-backend@0.2.16 - - @backstage/plugin-rollbar-backend@0.1.19 - - @backstage/plugin-scaffolder-backend-module-rails@0.2.4 - - @backstage/plugin-search-backend-module-elasticsearch@0.0.8 - - @backstage/plugin-search-backend-module-pg@0.2.4 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.6 - - @backstage/plugin-todo-backend@0.1.19 - -## 0.2.61-next.0 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.7.0-next.0 - - @backstage/plugin-permission-backend@0.4.0-next.0 - - @backstage/plugin-catalog-backend@0.21.0-next.0 - - @backstage/plugin-permission-common@0.4.0-next.0 - - @backstage/backend-common@0.10.4-next.0 - - @backstage/config@0.1.13-next.0 - - @backstage/plugin-app-backend@0.3.22-next.0 - - @backstage/plugin-permission-node@0.4.0-next.0 - - @backstage/plugin-tech-insights-backend@0.2.0-next.0 - - @backstage/plugin-tech-insights-node@0.2.0-next.0 - - @backstage/catalog-model@0.9.10-next.0 - - example-app@0.2.61-next.0 - - @backstage/plugin-scaffolder-backend@0.15.21-next.0 - - @backstage/backend-tasks@0.1.4-next.0 - - @backstage/catalog-client@0.5.5-next.0 - - @backstage/integration@0.7.2-next.0 - - @backstage/plugin-azure-devops-backend@0.3.1-next.0 - - @backstage/plugin-badges-backend@0.1.16-next.0 - - @backstage/plugin-code-coverage-backend@0.1.20-next.0 - - @backstage/plugin-graphql-backend@0.1.12-next.0 - - @backstage/plugin-jenkins-backend@0.1.11-next.0 - - @backstage/plugin-kafka-backend@0.2.15-next.0 - - @backstage/plugin-kubernetes-backend@0.4.4-next.0 - - @backstage/plugin-proxy-backend@0.2.16-next.0 - - @backstage/plugin-rollbar-backend@0.1.19-next.0 - - @backstage/plugin-scaffolder-backend-module-rails@0.2.4-next.0 - - @backstage/plugin-search-backend@0.3.1-next.0 - - @backstage/plugin-search-backend-module-elasticsearch@0.0.8-next.0 - - @backstage/plugin-search-backend-module-pg@0.2.4-next.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.6-next.0 - - @backstage/plugin-techdocs-backend@0.12.4-next.0 - - @backstage/plugin-todo-backend@0.1.19-next.0 - -## 0.2.60 - -### Patch Changes - -- Updated dependencies - - @backstage/config@0.1.12 - - @backstage/plugin-scaffolder-backend@0.15.20 - - @backstage/integration@0.7.1 - - @backstage/backend-common@0.10.3 - - @backstage/plugin-todo-backend@0.1.18 - - @backstage/plugin-catalog-backend@0.20.0 - - @backstage/plugin-tech-insights-backend@0.1.5 - - @backstage/plugin-permission-node@0.3.0 - - @backstage/plugin-auth-backend@0.6.2 - - @backstage/plugin-code-coverage-backend@0.1.19 - - @backstage/plugin-search-backend-node@0.4.4 - - @backstage/plugin-techdocs-backend@0.12.3 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.5 - - @backstage/plugin-permission-backend@0.3.0 - - @backstage/plugin-graphql-backend@0.1.11 - - @backstage/plugin-kubernetes-backend@0.4.3 - - example-app@0.2.60 - - @backstage/backend-tasks@0.1.3 - - @backstage/catalog-client@0.5.4 - - @backstage/catalog-model@0.9.9 - - @backstage/plugin-badges-backend@0.1.15 - - @backstage/plugin-kafka-backend@0.2.14 - - @backstage/plugin-permission-common@0.3.1 - - @backstage/plugin-scaffolder-backend-module-rails@0.2.3 - -## 0.2.59 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-rollbar-backend@0.1.18 - - @backstage/plugin-auth-backend@0.6.0 - - @backstage/backend-common@0.10.1 - - @backstage/plugin-app-backend@0.3.21 - - @backstage/plugin-catalog-backend@0.19.4 - - @backstage/plugin-scaffolder-backend@0.15.19 - - @backstage/integration@0.7.0 - - @backstage/plugin-techdocs-backend@0.12.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.4 - - @backstage/plugin-permission-backend@0.2.3 - - @backstage/plugin-permission-node@0.2.3 - - @backstage/plugin-code-coverage-backend@0.1.18 - - @backstage/plugin-scaffolder-backend-module-rails@0.2.2 - - @backstage/plugin-todo-backend@0.1.17 - -## 0.2.58 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.10.0 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.3 - - @backstage/plugin-scaffolder-backend-module-rails@0.2.1 - - @backstage/catalog-client@0.5.3 - - @backstage/plugin-rollbar-backend@0.1.17 - - @backstage/plugin-auth-backend@0.5.2 - - @backstage/plugin-permission-common@0.3.0 - - @backstage/plugin-search-backend@0.3.0 - - @backstage/plugin-techdocs-backend@0.12.1 - - @backstage/plugin-jenkins-backend@0.1.10 - - @backstage/plugin-permission-node@0.2.2 - - example-app@0.2.58 - - @backstage/plugin-app-backend@0.3.20 - - @backstage/plugin-azure-devops-backend@0.2.6 - - @backstage/plugin-badges-backend@0.1.14 - - @backstage/plugin-catalog-backend@0.19.3 - - @backstage/plugin-code-coverage-backend@0.1.17 - - @backstage/plugin-graphql-backend@0.1.10 - - @backstage/plugin-kafka-backend@0.2.13 - - @backstage/plugin-kubernetes-backend@0.4.1 - - @backstage/plugin-permission-backend@0.2.2 - - @backstage/plugin-proxy-backend@0.2.15 - - @backstage/plugin-scaffolder-backend@0.15.18 - - @backstage/plugin-search-backend-module-pg@0.2.3 - - @backstage/plugin-tech-insights-backend@0.1.4 - - @backstage/plugin-tech-insights-node@0.1.2 - - @backstage/plugin-todo-backend@0.1.16 - -## 0.2.57 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-search-backend-module-elasticsearch@0.0.7 - - @backstage/plugin-catalog-backend@0.19.2 - - @backstage/plugin-scaffolder-backend@0.15.17 - - @backstage/backend-common@0.9.14 - - @backstage/plugin-azure-devops-backend@0.2.5 - - @backstage/plugin-auth-backend@0.5.1 - - @backstage/catalog-model@0.9.8 - - example-app@0.2.57 - -## 0.2.56 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.5.0 - - @backstage/plugin-scaffolder-backend@0.15.16 - - @backstage/plugin-kubernetes-backend@0.4.0 - - @backstage/backend-common@0.9.13 - - @backstage/plugin-catalog-backend@0.19.1 - - @backstage/plugin-search-backend@0.2.8 - - @backstage/plugin-search-backend-module-elasticsearch@0.0.6 - - @backstage/plugin-search-backend-module-pg@0.2.2 - - @backstage/plugin-techdocs-backend@0.12.0 - - @backstage/plugin-todo-backend@0.1.15 - - @backstage/plugin-scaffolder-backend-module-rails@0.2.0 - - @backstage/plugin-azure-devops-backend@0.2.4 - - example-app@0.2.56 - -## 0.2.55 - -### Patch Changes - -- Updated dependencies - - @backstage/integration@0.6.10 - - @backstage/plugin-scaffolder-backend@0.15.15 - - @backstage/plugin-auth-backend@0.4.10 - - @backstage/plugin-kubernetes-backend@0.3.20 - - @backstage/plugin-badges-backend@0.1.13 - - @backstage/plugin-catalog-backend@0.19.0 - - @backstage/plugin-code-coverage-backend@0.1.16 - - @backstage/plugin-jenkins-backend@0.1.9 - - @backstage/plugin-tech-insights-backend@0.1.3 - - @backstage/plugin-techdocs-backend@0.11.0 - - @backstage/plugin-todo-backend@0.1.14 - - @backstage/backend-common@0.9.12 - - @backstage/plugin-azure-devops-backend@0.2.3 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.2 - - @backstage/plugin-tech-insights-node@0.1.1 - - example-app@0.2.55 - -## 0.2.54 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.3.19 - - @backstage/plugin-tech-insights-backend@0.1.2 - - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.1 - - @backstage/plugin-auth-backend@0.4.9 - - @backstage/plugin-scaffolder-backend@0.15.14 - - @backstage/plugin-catalog-backend@0.18.0 - - @backstage/plugin-kafka-backend@0.2.12 - - @backstage/backend-common@0.9.11 - - @backstage/plugin-azure-devops-backend@0.2.2 - - @backstage/plugin-badges-backend@0.1.12 - - @backstage/plugin-code-coverage-backend@0.1.15 - - @backstage/plugin-jenkins-backend@0.1.8 - - @backstage/plugin-proxy-backend@0.2.14 - - @backstage/plugin-rollbar-backend@0.1.16 - - @backstage/plugin-search-backend@0.2.7 - - @backstage/plugin-techdocs-backend@0.10.9 - -## 0.2.52 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.9.9 - - @backstage/plugin-jenkins-backend@0.1.7 - - @backstage/plugin-search-backend-module-elasticsearch@0.0.5 - - @backstage/plugin-scaffolder-backend@0.15.12 - - @backstage/plugin-azure-devops-backend@0.2.0 - - @backstage/catalog-client@0.5.1 - - @backstage/plugin-auth-backend@0.4.7 - - @backstage/plugin-catalog-backend@0.17.3 - - @backstage/plugin-scaffolder-backend-module-rails@0.1.7 - -## 0.2.50 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.4.4 - - @backstage/integration@0.6.8 - - @backstage/plugin-scaffolder-backend@0.15.8 - - @backstage/plugin-catalog-backend@0.17.0 - - @backstage/plugin-azure-devops-backend@0.1.2 - - @backstage/plugin-code-coverage-backend@0.1.13 - - @backstage/plugin-kubernetes-backend@0.3.17 - - example-app@0.2.50 - -## 0.2.49 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@0.16.0 - - @backstage/catalog-model@0.9.4 - - @backstage/plugin-proxy-backend@0.2.13 - - @backstage/plugin-auth-backend@0.4.3 - - @backstage/backend-common@0.9.6 - - @backstage/catalog-client@0.5.0 - - @backstage/integration@0.6.7 - - @backstage/plugin-scaffolder-backend@0.15.7 - - example-app@0.2.49 - - @backstage/plugin-badges-backend@0.1.11 - - @backstage/plugin-code-coverage-backend@0.1.12 - - @backstage/plugin-jenkins-backend@0.1.6 - - @backstage/plugin-techdocs-backend@0.10.4 - - @backstage/plugin-todo-backend@0.1.13 - -## 0.2.48 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.9.5 - - @backstage/plugin-catalog-backend@0.15.0 - - @backstage/plugin-azure-devops-backend@0.1.1 - - @backstage/integration@0.6.6 - - @backstage/plugin-auth-backend@0.4.2 - - example-app@0.2.48 - -## 0.2.47 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@0.14.0 - - @backstage/integration@0.6.5 - - @backstage/catalog-client@0.4.0 - - @backstage/catalog-model@0.9.3 - - @backstage/backend-common@0.9.4 - - @backstage/config@0.1.10 - - @backstage/plugin-kafka-backend@0.2.10 - - @backstage/plugin-kubernetes-backend@0.3.16 - - @backstage/plugin-rollbar-backend@0.1.15 - - @backstage/plugin-search-backend-module-pg@0.2.1 - - example-app@0.2.47 - - @backstage/plugin-auth-backend@0.4.1 - - @backstage/plugin-badges-backend@0.1.10 - - @backstage/plugin-code-coverage-backend@0.1.11 - - @backstage/plugin-jenkins-backend@0.1.5 - - @backstage/plugin-scaffolder-backend@0.15.6 - - @backstage/plugin-techdocs-backend@0.10.3 - - @backstage/plugin-todo-backend@0.1.12 - -## 0.2.46 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.4.0 - - @backstage/plugin-scaffolder-backend@0.15.5 - - @backstage/backend-common@0.9.3 - - @backstage/plugin-catalog-backend@0.13.8 - - @backstage/plugin-techdocs-backend@0.10.2 - - @backstage/integration@0.6.4 - - @backstage/plugin-search-backend-module-elasticsearch@0.0.4 - - example-app@0.2.46 - -## 0.2.44 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-catalog-backend@0.13.6 - - @backstage/plugin-scaffolder-backend@0.15.3 - - @backstage/plugin-techdocs-backend@0.10.1 - - @backstage/plugin-auth-backend@0.3.24 - - @backstage/integration@0.6.3 - - @backstage/plugin-search-backend@0.2.6 - - @backstage/plugin-search-backend-module-elasticsearch@0.0.3 - - @backstage/plugin-search-backend-module-pg@0.2.0 - - @backstage/plugin-search-backend-node@0.4.2 - - @backstage/catalog-model@0.9.1 - - @backstage/backend-common@0.9.1 - - example-app@0.2.44 - -## 0.2.43 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.9.0 - - @backstage/plugin-catalog-backend@0.13.5 - - @backstage/plugin-search-backend-module-pg@0.1.3 - - @backstage/plugin-auth-backend@0.3.23 - - @backstage/plugin-scaffolder-backend@0.15.2 - - @backstage/integration@0.6.2 - - @backstage/config@0.1.8 - - @backstage/plugin-kubernetes-backend@0.3.15 - - @backstage/plugin-techdocs-backend@0.10.0 - - @backstage/plugin-jenkins-backend@0.1.4 - - @backstage/plugin-app-backend@0.3.16 - - @backstage/plugin-badges-backend@0.1.9 - - @backstage/plugin-code-coverage-backend@0.1.10 - - @backstage/plugin-graphql-backend@0.1.9 - - @backstage/plugin-kafka-backend@0.2.9 - - @backstage/plugin-proxy-backend@0.2.12 - - @backstage/plugin-rollbar-backend@0.1.14 - - @backstage/plugin-scaffolder-backend-module-rails@0.1.5 - - @backstage/plugin-search-backend@0.2.5 - - @backstage/plugin-todo-backend@0.1.11 - - example-app@0.2.43 - -## 0.2.41 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-auth-backend@0.3.20 - - @backstage/integration@0.6.0 - - @backstage/plugin-scaffolder-backend@0.15.0 - - @backstage/backend-common@0.8.9 - - @backstage/plugin-kubernetes-backend@0.3.14 - - @backstage/plugin-search-backend-module-elasticsearch@0.0.2 - - @backstage/plugin-search-backend-module-pg@0.1.1 - - @backstage/plugin-catalog-backend@0.13.2 - - @backstage/plugin-code-coverage-backend@0.1.9 - - @backstage/plugin-scaffolder-backend-module-rails@0.1.4 - - @backstage/plugin-techdocs-backend@0.9.2 - - @backstage/plugin-todo-backend@0.1.9 - - example-app@0.2.41 - -## 0.2.38 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-kubernetes-backend@0.3.11 - - @backstage/catalog-client@0.3.17 - - @backstage/plugin-auth-backend@0.3.18 - - @backstage/plugin-jenkins-backend@0.1.2 - - @backstage/backend-common@0.8.7 - - @backstage/plugin-techdocs-backend@0.9.0 - - @backstage/plugin-scaffolder-backend@0.14.1 - -## 0.2.37 - -### Patch Changes - -- Updated dependencies - - @backstage/backend-common@0.8.6 - - @backstage/plugin-scaffolder-backend@0.14.0 - - @backstage/plugin-catalog-backend@0.13.0 - - @backstage/plugin-auth-backend@0.3.17 - - @backstage/plugin-scaffolder-backend-module-rails@0.1.3 - - @backstage/plugin-search-backend-node@0.4.0 - - @backstage/plugin-techdocs-backend@0.8.7 - - @backstage/plugin-app-backend@0.3.15 - - @backstage/plugin-kubernetes-backend@0.3.10 - - @backstage/plugin-rollbar-backend@0.1.13 - - example-app@0.2.37 - - @backstage/plugin-search-backend@0.2.3 - -## 0.2.36 - -### Patch Changes - -- Updated dependencies - - @backstage/integration@0.5.8 - - @backstage/plugin-scaffolder-backend@0.13.0 - - @backstage/catalog-model@0.9.0 - - @backstage/plugin-catalog-backend@0.12.0 - - @backstage/backend-common@0.8.5 - - @backstage/plugin-search-backend-node@0.3.0 - - example-app@0.2.36 - - @backstage/plugin-scaffolder-backend-module-rails@0.1.2 - - @backstage/catalog-client@0.3.16 - - @backstage/plugin-auth-backend@0.3.16 - - @backstage/plugin-badges-backend@0.1.8 - - @backstage/plugin-code-coverage-backend@0.1.8 - - @backstage/plugin-kafka-backend@0.2.8 - - @backstage/plugin-kubernetes-backend@0.3.9 - - @backstage/plugin-techdocs-backend@0.8.6 - - @backstage/plugin-todo-backend@0.1.8 - - @backstage/plugin-search-backend@0.2.2 - -## 0.2.35 - -### Patch Changes - -- Updated dependencies - - @backstage/plugin-scaffolder-backend@0.12.4 - - @backstage/backend-common@0.8.4 - - @backstage/plugin-auth-backend@0.3.15 - - @backstage/plugin-catalog-backend@0.11.0 - - @backstage/plugin-techdocs-backend@0.8.5 - - @backstage/catalog-client@0.3.15 - - @backstage/plugin-kafka-backend@0.2.7 - -## 0.2.32 - -### Patch Changes - -- Updated dependencies [9c63be545] -- Updated dependencies [92963779b] -- Updated dependencies [27a9b503a] -- Updated dependencies [66c6bfebd] -- Updated dependencies [55a253de2] -- Updated dependencies [70bc30c5b] -- Updated dependencies [db1c8f93b] -- Updated dependencies [5aff84759] -- Updated dependencies [f26e6008f] -- Updated dependencies [eda9dbd5f] -- Updated dependencies [4f8cf50fe] -- Updated dependencies [875809a59] - - @backstage/plugin-catalog-backend@0.10.2 - - @backstage/backend-common@0.8.2 - - @backstage/catalog-model@0.8.2 - - @backstage/plugin-scaffolder-backend@0.12.0 - - @backstage/catalog-client@0.3.13 - - @backstage/plugin-search-backend-node@0.2.0 - - @backstage/plugin-search-backend@0.2.0 - - @backstage/plugin-proxy-backend@0.2.9 - - example-app@0.2.32 - -## 0.2.30 - -### Patch Changes - -- Updated dependencies [0fd4ea443] -- Updated dependencies [add62a455] -- Updated dependencies [260aaa684] -- Updated dependencies [704875e26] - - @backstage/plugin-catalog-backend@0.10.0 - - @backstage/catalog-client@0.3.12 - - @backstage/catalog-model@0.8.0 - - @backstage/plugin-scaffolder-backend@0.11.4 - - example-app@0.2.30 - - @backstage/plugin-auth-backend@0.3.12 - - @backstage/plugin-badges-backend@0.1.6 - - @backstage/plugin-code-coverage-backend@0.1.6 - - @backstage/plugin-kafka-backend@0.2.6 - - @backstage/plugin-kubernetes-backend@0.3.8 - - @backstage/plugin-techdocs-backend@0.8.2 - - @backstage/plugin-todo-backend@0.1.6 - -## 0.2.28 - -### Patch Changes - -- Updated dependencies [062bbf90f] -- Updated dependencies [22fd8ce2a] -- Updated dependencies [10c008a3a] -- Updated dependencies [82ca1ac22] -- Updated dependencies [f9fb4a205] -- Updated dependencies [9a207f052] -- Updated dependencies [16be1d093] -- Updated dependencies [fd39d4662] -- Updated dependencies [f9f9d633d] - - @backstage/plugin-scaffolder-backend@0.11.1 - - @backstage/backend-common@0.8.0 - - @backstage/catalog-model@0.7.9 - - @backstage/plugin-catalog-backend@0.9.0 - - @backstage/plugin-kubernetes-backend@0.3.7 - - example-app@0.2.28 - - @backstage/plugin-app-backend@0.3.13 - - @backstage/plugin-auth-backend@0.3.10 - - @backstage/plugin-badges-backend@0.1.4 - - @backstage/plugin-code-coverage-backend@0.1.5 - - @backstage/plugin-graphql-backend@0.1.8 - - @backstage/plugin-kafka-backend@0.2.5 - - @backstage/plugin-proxy-backend@0.2.8 - - @backstage/plugin-rollbar-backend@0.1.11 - - @backstage/plugin-search-backend@0.1.5 - - @backstage/plugin-techdocs-backend@0.8.1 - - @backstage/plugin-todo-backend@0.1.5 - -## 0.2.27 - -### Patch Changes - -- Updated dependencies [e0bfd3d44] -- Updated dependencies [e0bfd3d44] -- Updated dependencies [e0bfd3d44] -- Updated dependencies [38ca05168] -- Updated dependencies [b219821a0] -- Updated dependencies [69eefb5ae] -- Updated dependencies [f53fba29f] -- Updated dependencies [75c8cec39] -- Updated dependencies [227439a72] -- Updated dependencies [cdb3426e5] -- Updated dependencies [d8b81fd28] -- Updated dependencies [d1b1306d9] - - @backstage/plugin-scaffolder-backend@0.11.0 - - @backstage/backend-common@0.7.0 - - @backstage/plugin-techdocs-backend@0.8.0 - - @backstage/plugin-catalog-backend@0.8.2 - - @backstage/plugin-kubernetes-backend@0.3.6 - - @backstage/plugin-proxy-backend@0.2.7 - - @backstage/catalog-model@0.7.8 - - @backstage/config@0.1.5 - - @backstage/catalog-client@0.3.11 - - example-app@0.2.27 - - @backstage/plugin-app-backend@0.3.12 - - @backstage/plugin-auth-backend@0.3.9 - - @backstage/plugin-badges-backend@0.1.3 - - @backstage/plugin-code-coverage-backend@0.1.4 - - @backstage/plugin-graphql-backend@0.1.7 - - @backstage/plugin-kafka-backend@0.2.4 - - @backstage/plugin-rollbar-backend@0.1.10 - - @backstage/plugin-search-backend@0.1.4 - - @backstage/plugin-todo-backend@0.1.4 - -## 0.2.25 - -### Patch Changes - -- Updated dependencies [b9b2b4b76] -- Updated dependencies [84c54474d] -- Updated dependencies [49574a8a3] -- Updated dependencies [d367f63b5] -- Updated dependencies [5fe62f124] -- Updated dependencies [09b5fcf2e] -- Updated dependencies [55b2fc0c0] -- Updated dependencies [c42cd1daa] -- Updated dependencies [b42531cfe] -- Updated dependencies [c2306f898] - - @backstage/plugin-search-backend@0.1.3 - - @backstage/plugin-search-backend-node@0.1.3 - - @backstage/plugin-scaffolder-backend@0.10.0 - - @backstage/plugin-rollbar-backend@0.1.9 - - @backstage/backend-common@0.6.3 - - @backstage/plugin-catalog-backend@0.8.0 - - @backstage/plugin-code-coverage-backend@0.1.2 - - @backstage/plugin-kubernetes-backend@0.3.5 - - example-app@0.2.25 - -## 0.2.22 - -### Patch Changes - -- Updated dependencies [f03a52f5b] -- Updated dependencies [676ede643] -- Updated dependencies [1ac6a5233] -- Updated dependencies [2ab6f3ff0] -- Updated dependencies [0d55dcc74] -- Updated dependencies [29e1789e1] -- Updated dependencies [f1b2c1d2c] -- Updated dependencies [60e463c8d] -- Updated dependencies [676ede643] -- Updated dependencies [b196a4569] -- Updated dependencies [8488a1a96] -- Updated dependencies [37e3a69f5] -- Updated dependencies [6b2d54fd6] -- Updated dependencies [44590510d] -- Updated dependencies [164cc4c53] - - @backstage/plugin-kafka-backend@0.2.3 - - @backstage/plugin-catalog-backend@0.7.0 - - @backstage/plugin-kubernetes-backend@0.3.3 - - @backstage/plugin-scaffolder-backend@0.9.4 - - @backstage/plugin-auth-backend@0.3.7 - - @backstage/catalog-client@0.3.9 - - @backstage/plugin-todo-backend@0.1.3 - - @backstage/catalog-model@0.7.5 - - @backstage/backend-common@0.6.1 - -## 0.2.21 - -### Patch Changes - -- Updated dependencies [a2a3c7803] -- Updated dependencies [9f2e51e89] -- Updated dependencies [4d248725e] -- Updated dependencies [aaeb7ecf3] -- Updated dependencies [449776cd6] -- Updated dependencies [91e87c055] -- Updated dependencies [36d933ec5] -- Updated dependencies [113d3d59e] -- Updated dependencies [f47e11427] -- Updated dependencies [c862b3f36] - - @backstage/plugin-kubernetes-backend@0.3.2 - - @backstage/plugin-scaffolder-backend@0.9.3 - - @backstage/plugin-search-backend@0.1.2 - - @backstage/plugin-search-backend-node@0.1.2 - - @backstage/plugin-techdocs-backend@0.7.0 - - @backstage/plugin-auth-backend@0.3.6 - - @backstage/plugin-todo-backend@0.1.2 - - @backstage/plugin-catalog-backend@0.6.7 - - example-app@0.2.21 - -## 0.2.20 - -### Patch Changes - -- Updated dependencies [010aed784] -- Updated dependencies [8686eb38c] -- Updated dependencies [e7baa0d2e] -- Updated dependencies [8b4f7e42a] -- Updated dependencies [8686eb38c] -- Updated dependencies [0434853a5] -- Updated dependencies [4bc98a5b9] -- Updated dependencies [d2f4efc5d] -- Updated dependencies [8686eb38c] -- Updated dependencies [424742dc1] -- Updated dependencies [1f98a6ff8] -- Updated dependencies [8b5e59750] -- Updated dependencies [8686eb38c] - - @backstage/plugin-catalog-backend@0.6.6 - - @backstage/catalog-client@0.3.8 - - @backstage/plugin-techdocs-backend@0.6.5 - - @backstage/plugin-scaffolder-backend@0.9.2 - - @backstage/backend-common@0.6.0 - - @backstage/config@0.1.4 - - @backstage/plugin-auth-backend@0.3.5 - - @backstage/plugin-kubernetes-backend@0.3.1 - - example-app@0.2.20 - - @backstage/plugin-app-backend@0.3.10 - - @backstage/plugin-graphql-backend@0.1.6 - - @backstage/plugin-kafka-backend@0.2.2 - - @backstage/plugin-proxy-backend@0.2.6 - - @backstage/plugin-rollbar-backend@0.1.8 - - @backstage/plugin-todo-backend@0.1.1 - -## 0.2.19 - -### Patch Changes - -- Updated dependencies [5d7834baf] -- Updated dependencies [9ef5a126d] -- Updated dependencies [d7245b733] -- Updated dependencies [393b623ae] -- Updated dependencies [d7245b733] -- Updated dependencies [0b42fff22] -- Updated dependencies [0b42fff22] -- Updated dependencies [2ef5bc7ea] -- Updated dependencies [c532c1682] -- Updated dependencies [761698831] -- Updated dependencies [aa095e469] -- Updated dependencies [761698831] -- Updated dependencies [f98f212e4] -- Updated dependencies [9581ff0b4] -- Updated dependencies [93c62c755] -- Updated dependencies [02d78290a] -- Updated dependencies [a501128db] -- Updated dependencies [8de9963f0] -- Updated dependencies [5f1b7ea35] -- Updated dependencies [2e57922de] -- Updated dependencies [e2c1b3fb6] - - @backstage/plugin-kubernetes-backend@0.3.0 - - @backstage/plugin-catalog-backend@0.6.5 - - @backstage/backend-common@0.5.6 - - @backstage/plugin-app-backend@0.3.9 - - @backstage/plugin-scaffolder-backend@0.9.1 - - @backstage/catalog-model@0.7.4 - - @backstage/catalog-client@0.3.7 - - @backstage/plugin-techdocs-backend@0.6.4 - - @backstage/plugin-auth-backend@0.3.4 - - example-app@0.2.19 - -## 0.2.18 - -### Patch Changes - -- Updated dependencies [12d8f27a6] -- Updated dependencies [52b5bc3e2] -- Updated dependencies [ecdd407b1] -- Updated dependencies [4fbc9df79] -- Updated dependencies [12d8f27a6] -- Updated dependencies [497859088] -- Updated dependencies [1987c9341] -- Updated dependencies [f31b76b44] -- Updated dependencies [15eee03bc] -- Updated dependencies [f43192207] -- Updated dependencies [8adb48df4] -- Updated dependencies [e3adec2bd] -- Updated dependencies [9ce68b677] -- Updated dependencies [8106c9528] -- Updated dependencies [d0ed25196] -- Updated dependencies [96ccc8f69] -- Updated dependencies [3af994c81] - - @backstage/plugin-scaffolder-backend@0.9.0 - - @backstage/plugin-techdocs-backend@0.6.3 - - @backstage/plugin-catalog-backend@0.6.4 - - @backstage/plugin-kafka-backend@0.2.1 - - @backstage/catalog-model@0.7.3 - - @backstage/backend-common@0.5.5 - - @backstage/plugin-proxy-backend@0.2.5 - - @backstage/plugin-auth-backend@0.3.3 - - @backstage/plugin-kubernetes-backend@0.2.8 - - example-app@0.2.18 - -## 0.2.17 - -### Patch Changes - -- Updated dependencies [a70af22a2] -- Updated dependencies [ec504e7b4] -- Updated dependencies [a5f42cf66] -- Updated dependencies [f37992797] -- Updated dependencies [bad21a085] -- Updated dependencies [1c06cb312] -- Updated dependencies [2499f6cde] -- Updated dependencies [a1f5e6545] - - @backstage/plugin-kubernetes-backend@0.2.7 - - @backstage/plugin-auth-backend@0.3.2 - - @backstage/plugin-scaffolder-backend@0.8.0 - - @backstage/plugin-techdocs-backend@0.6.2 - - @backstage/catalog-model@0.7.2 - - @backstage/plugin-app-backend@0.3.8 - - @backstage/plugin-catalog-backend@0.6.3 - - @backstage/config@0.1.3 - - example-app@0.2.17 - -## 0.2.15 - -### Patch Changes - -- Updated dependencies [1deb31141] -- Updated dependencies [6ed2b47d6] -- Updated dependencies [77ad0003a] -- Updated dependencies [d2441aee3] -- Updated dependencies [727f0deec] -- Updated dependencies [fb53eb7cb] -- Updated dependencies [07bafa248] -- Updated dependencies [ffffea8e6] -- Updated dependencies [f3fbfb452] -- Updated dependencies [615103a63] -- Updated dependencies [84364b35c] -- Updated dependencies [82b2c11b6] -- Updated dependencies [965e200c6] -- Updated dependencies [5a5163519] -- Updated dependencies [82b2c11b6] -- Updated dependencies [08142b256] -- Updated dependencies [08142b256] - - @backstage/plugin-auth-backend@0.3.0 - - @backstage/plugin-scaffolder-backend@0.7.0 - - @backstage/plugin-catalog-backend@0.6.1 - - @backstage/plugin-app-backend@0.3.7 - - example-app@0.2.15 - - @backstage/backend-common@0.5.3 - - @backstage/plugin-techdocs-backend@0.6.0 - -## 0.2.14 - -### Patch Changes - -- Updated dependencies [c777df180] -- Updated dependencies [2430ee7c2] -- Updated dependencies [3149bfe63] -- Updated dependencies [6e612ce25] -- Updated dependencies [e44925723] -- Updated dependencies [9d6ef14bc] -- Updated dependencies [a26668913] -- Updated dependencies [025e122c3] -- Updated dependencies [e9aab60c7] -- Updated dependencies [24e47ef1e] -- Updated dependencies [7881f2117] -- Updated dependencies [529d16d27] -- Updated dependencies [cdea0baf1] -- Updated dependencies [11cb5ef94] - - @backstage/plugin-techdocs-backend@0.5.5 - - @backstage/backend-common@0.5.2 - - @backstage/plugin-catalog-backend@0.6.0 - - @backstage/catalog-model@0.7.1 - - example-app@0.2.14 - - @backstage/plugin-scaffolder-backend@0.6.0 - - @backstage/plugin-app-backend@0.3.6 - -## 0.2.13 - -### Patch Changes - -- Updated dependencies [26a3a6cf0] -- Updated dependencies [681111228] -- Updated dependencies [664dd08c9] -- Updated dependencies [9dd057662] -- Updated dependencies [234e7d985] -- Updated dependencies [d7b1d317f] -- Updated dependencies [a91aa6bf2] -- Updated dependencies [39b05b9ae] -- Updated dependencies [4eaa06057] - - @backstage/backend-common@0.5.1 - - @backstage/plugin-scaffolder-backend@0.5.2 - - @backstage/plugin-kubernetes-backend@0.2.6 - - @backstage/plugin-catalog-backend@0.5.5 - - @backstage/plugin-kafka-backend@0.2.0 - - @backstage/plugin-auth-backend@0.2.12 - - example-app@0.2.13 - - @backstage/plugin-app-backend@0.3.5 - -## 0.2.12 - -### Patch Changes - -- Updated dependencies [def2307f3] -- Updated dependencies [d54857099] -- Updated dependencies [0b135e7e0] -- Updated dependencies [318a6af9f] -- Updated dependencies [294a70cab] -- Updated dependencies [ac7be581a] -- Updated dependencies [0ea032763] -- Updated dependencies [5345a1f98] -- Updated dependencies [ed6baab66] -- Updated dependencies [ad838c02f] -- Updated dependencies [a5e27d5c1] -- Updated dependencies [0643a3336] -- Updated dependencies [a2291d7cc] -- Updated dependencies [f9ba00a1c] -- Updated dependencies [09a370426] -- Updated dependencies [a93f42213] - - @backstage/catalog-model@0.7.0 - - @backstage/plugin-catalog-backend@0.5.4 - - @backstage/plugin-kubernetes-backend@0.2.5 - - @backstage/backend-common@0.5.0 - - @backstage/plugin-scaffolder-backend@0.5.0 - - @backstage/plugin-techdocs-backend@0.5.4 - - @backstage/plugin-auth-backend@0.2.11 - - example-app@0.2.12 - - @backstage/plugin-kafka-backend@0.1.1 - - @backstage/plugin-app-backend@0.3.4 - - @backstage/plugin-graphql-backend@0.1.5 - - @backstage/plugin-proxy-backend@0.2.4 - - @backstage/plugin-rollbar-backend@0.1.7 - -## 0.2.11 - -### Patch Changes - -- cc068c0d6: Bump the gitbeaker dependencies to 28.x. - - To update your own installation, go through the `package.json` files of all of - your packages, and ensure that all dependencies on `@gitbeaker/node` or - `@gitbeaker/core` are at version `^28.0.2`. Then run `yarn install` at the root - of your repo. - -- Updated dependencies [68ad5af51] -- Updated dependencies [5a9a7e7c2] -- Updated dependencies [f3b064e1c] -- Updated dependencies [94fdf4955] -- Updated dependencies [cc068c0d6] -- Updated dependencies [ade6b3bdf] -- Updated dependencies [468579734] -- Updated dependencies [cb7af51e7] -- Updated dependencies [abbee6fff] -- Updated dependencies [147fadcb9] -- Updated dependencies [711ba55a2] - - @backstage/plugin-techdocs-backend@0.5.3 - - @backstage/plugin-kubernetes-backend@0.2.4 - - @backstage/catalog-model@0.6.1 - - @backstage/plugin-catalog-backend@0.5.3 - - @backstage/plugin-scaffolder-backend@0.4.1 - - @backstage/plugin-auth-backend@0.2.10 - - @backstage/backend-common@0.4.3 - -## 0.2.10 - -### Patch Changes - -- Updated dependencies [5eb8c9b9e] -- Updated dependencies [7e3451700] - - @backstage/plugin-scaffolder-backend@0.4.0 - -## 0.2.8 - -### Patch Changes - -- 7cfcd58ee: use node 14 for backend Dockerfile -- Updated dependencies [19554f6d6] -- Updated dependencies [33a82a713] -- Updated dependencies [5de26b9a6] -- Updated dependencies [30d6c78fb] -- Updated dependencies [5084e5039] -- Updated dependencies [a8573e53b] -- Updated dependencies [aed8f7f12] - - @backstage/plugin-scaffolder-backend@0.3.6 - - @backstage/plugin-catalog-backend@0.5.1 - - @backstage/plugin-techdocs-backend@0.5.0 - - example-app@0.2.8 - -## 0.2.7 - -### Patch Changes - -- Updated dependencies [c6eeefa35] -- Updated dependencies [fb386b760] -- Updated dependencies [c911061b7] -- Updated dependencies [7c3ffc0cd] -- Updated dependencies [dae4f3983] -- Updated dependencies [7b15cc271] -- Updated dependencies [e7496dc3e] -- Updated dependencies [1d1c2860f] -- Updated dependencies [0e6298f7e] -- Updated dependencies [8dd0a906d] -- Updated dependencies [4eafdec4a] -- Updated dependencies [6b37c95bf] -- Updated dependencies [8c31c681c] -- Updated dependencies [7b98e7fee] -- Updated dependencies [ac3560b42] -- Updated dependencies [94c65a9d4] -- Updated dependencies [0097057ed] - - @backstage/plugin-catalog-backend@0.5.0 - - @backstage/catalog-model@0.6.0 - - @backstage/plugin-techdocs-backend@0.4.0 - - @backstage/plugin-auth-backend@0.2.7 - - @backstage/backend-common@0.4.1 - - @backstage/plugin-scaffolder-backend@0.3.5 - - example-app@0.2.7 - - @backstage/plugin-kubernetes-backend@0.2.3 - -## 0.2.6 - -### Patch Changes - -- 1e22f8e0b: Unify `dockerode` library and type dependency versions -- Updated dependencies [6e8bb3ac0] -- Updated dependencies [e708679d7] -- Updated dependencies [047c018c9] -- Updated dependencies [38e24db00] -- Updated dependencies [e3bd9fc2f] -- Updated dependencies [12bbd748c] -- Updated dependencies [38d63fbe1] -- Updated dependencies [1e22f8e0b] -- Updated dependencies [83b6e0c1f] -- Updated dependencies [e3bd9fc2f] - - @backstage/plugin-catalog-backend@0.4.0 - - @backstage/backend-common@0.4.0 - - @backstage/config@0.1.2 - - @backstage/plugin-scaffolder-backend@0.3.4 - - @backstage/plugin-techdocs-backend@0.3.2 - - @backstage/catalog-model@0.5.0 - - example-app@0.2.6 - - @backstage/plugin-app-backend@0.3.3 - - @backstage/plugin-auth-backend@0.2.6 - - @backstage/plugin-graphql-backend@0.1.4 - - @backstage/plugin-kubernetes-backend@0.2.2 - - @backstage/plugin-proxy-backend@0.2.3 - - @backstage/plugin-rollbar-backend@0.1.5 - -## 0.2.5 - -### Patch Changes - -- Updated dependencies [ae95c7ff3] -- Updated dependencies [b4488ddb0] -- Updated dependencies [612368274] -- Updated dependencies [6a6c7c14e] -- Updated dependencies [08835a61d] -- Updated dependencies [a9fd599f7] -- Updated dependencies [e42402b47] -- Updated dependencies [bcc211a08] -- Updated dependencies [3619ea4c4] - - @backstage/plugin-techdocs-backend@0.3.1 - - @backstage/plugin-catalog-backend@0.3.0 - - @backstage/backend-common@0.3.3 - - @backstage/plugin-proxy-backend@0.2.2 - - @backstage/catalog-model@0.4.0 - - @backstage/plugin-kubernetes-backend@0.2.1 - - @backstage/plugin-app-backend@0.3.2 - - example-app@0.2.5 - - @backstage/plugin-auth-backend@0.2.5 - - @backstage/plugin-scaffolder-backend@0.3.3 - -## 0.2.4 - -### Patch Changes - -- Updated dependencies [50eff1d00] -- Updated dependencies [ff1301d28] -- Updated dependencies [4b53294a6] -- Updated dependencies [3aa7efb3f] -- Updated dependencies [1ec19a3f4] -- Updated dependencies [ab94c9542] -- Updated dependencies [3a201c5d5] -- Updated dependencies [2daf18e80] -- Updated dependencies [069cda35f] -- Updated dependencies [b3d4e4e57] -- Updated dependencies [700a212b4] - - @backstage/plugin-auth-backend@0.2.4 - - @backstage/plugin-app-backend@0.3.1 - - @backstage/plugin-techdocs-backend@0.3.0 - - @backstage/backend-common@0.3.2 - - @backstage/plugin-catalog-backend@0.2.3 - - @backstage/catalog-model@0.3.1 - - @backstage/plugin-rollbar-backend@0.1.4 - - example-app@0.2.4 - -## 0.2.3 - -### Patch Changes - -- Updated dependencies [1166fcc36] -- Updated dependencies [bff3305aa] -- Updated dependencies [0c2121240] -- Updated dependencies [ef2831dde] -- Updated dependencies [1185919f3] -- Updated dependencies [475fc0aaa] -- Updated dependencies [b47dce06f] -- Updated dependencies [5a1d8dca3] - - @backstage/catalog-model@0.3.0 - - @backstage/plugin-kubernetes-backend@0.2.0 - - @backstage/backend-common@0.3.1 - - @backstage/plugin-catalog-backend@0.2.2 - - @backstage/plugin-scaffolder-backend@0.3.2 - - example-app@0.2.3 - - @backstage/plugin-auth-backend@0.2.3 - - @backstage/plugin-techdocs-backend@0.2.2 - -## 0.2.2 - -### Patch Changes - -- Updated dependencies [1722cb53c] -- Updated dependencies [1722cb53c] -- Updated dependencies [1722cb53c] -- Updated dependencies [f531d307c] -- Updated dependencies [3efd03c0e] -- Updated dependencies [7b37e6834] -- Updated dependencies [8e2effb53] -- Updated dependencies [d33f5157c] - - @backstage/backend-common@0.3.0 - - @backstage/plugin-app-backend@0.3.0 - - @backstage/plugin-catalog-backend@0.2.1 - - example-app@0.2.2 - - @backstage/plugin-scaffolder-backend@0.3.1 - - @backstage/plugin-auth-backend@0.2.2 - - @backstage/plugin-graphql-backend@0.1.3 - - @backstage/plugin-kubernetes-backend@0.1.3 - - @backstage/plugin-proxy-backend@0.2.1 - - @backstage/plugin-rollbar-backend@0.1.3 - - @backstage/plugin-sentry-backend@0.1.3 - - @backstage/plugin-techdocs-backend@0.2.1 - -## 0.2.1 - -### Patch Changes - -- Updated dependencies [752808090] -- Updated dependencies [462876399] -- Updated dependencies [59166e5ec] -- Updated dependencies [33b7300eb] - - @backstage/plugin-auth-backend@0.2.1 - - @backstage/plugin-scaffolder-backend@0.3.0 - - @backstage/backend-common@0.2.1 - - example-app@0.2.1 - -## 0.2.0 - -### Patch Changes - -- 440a17b39: Bump @backstage/catalog-backend and pass the now required UrlReader interface to the plugin -- 6840a68df: Pass GitHub token into Scaffolder GitHub Preparer -- 8c2b76e45: **BREAKING CHANGE** - - The existing loading of additional config files like `app-config.development.yaml` using APP_ENV or NODE_ENV has been removed. - Instead, the CLI and backend process now accept one or more `--config` flags to load config files. - - Without passing any flags, `app-config.yaml` and, if it exists, `app-config.local.yaml` will be loaded. - If passing any `--config ` flags, only those files will be loaded, **NOT** the default `app-config.yaml` one. - - The old behaviour of for example `APP_ENV=development` can be replicated using the following flags: - - ```bash - --config ../../app-config.yaml --config ../../app-config.development.yaml - ``` - -- 7bbeb049f: Change loadBackendConfig to return the config directly -- Updated dependencies [28edd7d29] -- Updated dependencies [819a70229] -- Updated dependencies [3a4236570] -- Updated dependencies [3e254503d] -- Updated dependencies [6d29605db] -- Updated dependencies [e0be86b6f] -- Updated dependencies [f70a52868] -- Updated dependencies [12b5fe940] -- Updated dependencies [5249594c5] -- Updated dependencies [56e4eb589] -- Updated dependencies [b4e5466e1] -- Updated dependencies [6f1768c0f] -- Updated dependencies [e37c0a005] -- Updated dependencies [3472c8be7] -- Updated dependencies [57d555eb2] -- Updated dependencies [61db1ddc6] -- Updated dependencies [81cb94379] -- Updated dependencies [1687b8fbb] -- Updated dependencies [a768a07fb] -- Updated dependencies [a768a07fb] -- Updated dependencies [f00ca3cb8] -- Updated dependencies [0c370c979] -- Updated dependencies [ce1f55398] -- Updated dependencies [e6b00e3af] -- Updated dependencies [9226c2aaa] -- Updated dependencies [6d97d2d6f] -- Updated dependencies [99710b102] -- Updated dependencies [6579769df] -- Updated dependencies [002860e7a] -- Updated dependencies [5adfc005e] -- Updated dependencies [33454c0f2] -- Updated dependencies [183e2a30d] -- Updated dependencies [948052cbb] -- Updated dependencies [65d722455] -- Updated dependencies [b652bf2cc] -- Updated dependencies [4036ff59d] -- Updated dependencies [991a950e0] -- Updated dependencies [512d70973] -- Updated dependencies [8c2b76e45] -- Updated dependencies [8bdf0bcf5] -- Updated dependencies [c926765a2] -- Updated dependencies [5a920c6e4] -- Updated dependencies [2f62e1804] -- Updated dependencies [440a17b39] -- Updated dependencies [fa56f4615] -- Updated dependencies [8afce088a] -- Updated dependencies [4c4eab81b] -- Updated dependencies [22ff8fba5] -- Updated dependencies [36a71d278] -- Updated dependencies [b3d57961c] -- Updated dependencies [6840a68df] -- Updated dependencies [a5cb46bac] -- Updated dependencies [49d70ccab] -- Updated dependencies [1c8c43756] -- Updated dependencies [26e69ab1a] -- Updated dependencies [5e4551e3a] -- Updated dependencies [e142a2767] -- Updated dependencies [e7f5471fd] -- Updated dependencies [e3d063ffa] -- Updated dependencies [440a17b39] -- Updated dependencies [7bbeb049f] - - @backstage/plugin-app-backend@0.2.0 - - @backstage/plugin-auth-backend@0.2.0 - - @backstage/catalog-model@0.2.0 - - @backstage/plugin-scaffolder-backend@0.2.0 - - @backstage/plugin-techdocs-backend@0.2.0 - - @backstage/plugin-catalog-backend@0.2.0 - - @backstage/plugin-proxy-backend@0.2.0 - - @backstage/backend-common@0.2.0 - - example-app@0.2.0 - - @backstage/plugin-graphql-backend@0.1.2 - - @backstage/plugin-kubernetes-backend@0.1.2 - - @backstage/plugin-rollbar-backend@0.1.2 - - @backstage/plugin-sentry-backend@0.1.2 + - @backstage/backend-app-api@0.1.0-next.0 diff --git a/packages/backend/README.md b/packages/backend/README.md index f71fc9f9d8..46c749fc4b 100644 --- a/packages/backend/README.md +++ b/packages/backend/README.md @@ -1,6 +1,6 @@ # example-backend -This package is an EXAMPLE of a Backstage backend. +This package is an EXAMPLE of a Backstage backend using the [new backend system](https://backstage.io/docs/backend-system/). The main purpose of this package is to provide a test bed for Backstage plugins that have a backend part. Feel free to experiment locally or within your fork @@ -16,22 +16,22 @@ To run the example backend, first go to the project root and run yarn install ``` -You should only need to do this once. +This will install all dependencies for the project. You only need to do this once, unless you make changes to the dependency definitions. -After that, go to the `packages/backend` directory and run +You can then start the backend by running the following command in the repo root: ```bash -yarn start +yarn start-backend ``` If you want to override any configuration locally, for example adding any secrets, -you can do so in `app-config.local.yaml`. +you can do so in `app-config.local.yaml`, next to `app-config.yaml`. The backend starts up on port 7007 per default. ### Debugging -The backend is a node process that can be inspected to allow breakpoints and live debugging. To enable this, pass the `--inspect` flag to [backend:dev](https://backstage.io/docs/local-dev/cli-build-system#backend-development). +The backend is a node process that can be inspected to allow breakpoints and live debugging. To enable this, pass the `--inspect` flag when starting the backend. To debug the backend in [Visual Studio Code](https://code.visualstudio.com/): @@ -51,9 +51,7 @@ in `app-config.yaml` under `catalog.locations`. For local development you can ov ## Authentication -We chose [Passport](http://www.passportjs.org/) as authentication platform due to its comprehensive set of supported authentication [strategies](http://www.passportjs.org/packages/). - -Read more about the [auth-backend](https://github.com/backstage/backstage/blob/master/plugins/auth-backend/README.md) and [how to add a new provider](https://github.com/backstage/backstage/blob/master/docs/auth/add-auth-provider.md) +The example backend has guest access enabled by default. This means you do not need to configure a real authentication provider, but will instead be logged in as a guest user. ## Documentation diff --git a/packages/backend/knip-report.md b/packages/backend/knip-report.md index f57bda79b7..a26b412ee9 100644 --- a/packages/backend/knip-report.md +++ b/packages/backend/knip-report.md @@ -1,27 +1,12 @@ # Knip report -## Unused dependencies (13) +## Unused dependencies (5) -| Name | Location | Severity | -| :------------------------------------------------- | :----------- | :------- | -| @backstage/plugin-scaffolder-backend-module-gitlab | package.json | error | -| @backstage/plugin-scaffolder-backend-module-rails | package.json | error | -| @backstage/plugin-azure-sites-common | package.json | error | -| @backstage/plugin-tech-insights-node | package.json | error | -| azure-devops-node-api | package.json | error | -| pg-connection-string | package.json | error | -| @gitbeaker/node | package.json | error | -| better-sqlite3 | package.json | error | -| @octokit/rest | package.json | error | -| example-app | package.json | error | -| mysql2 | package.json | error | -| luxon | package.json | error | -| pg | package.json | error | - -## Unused devDependencies (2) - -| Name | Location | Severity | -| :------------------------------- | :----------- | :------- | -| @types/express-serve-static-core | package.json | error | -| @types/luxon | package.json | error | +| Name | Location | Severity | +| :----------------------------------------------- | :----------- | :------- | +| @backstage/plugin-catalog-backend-module-openapi | package.json | error | +| @backstage/plugin-search-backend-node | package.json | error | +| @backstage/plugin-permission-common | package.json | error | +| @backstage/plugin-permission-node | package.json | error | +| @backstage/backend-tasks | package.json | error | diff --git a/packages/backend/package.json b/packages/backend/package.json index 7f42df6681..c76a3be0a3 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.98-next.1", + "version": "0.0.26-next.1", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", @@ -18,75 +18,48 @@ "backstage" ], "scripts": { - "start": "backstage-cli package start", "build": "backstage-cli package build", - "lint": "backstage-cli package lint", - "test": "backstage-cli package test", "clean": "backstage-cli package clean", + "lint": "backstage-cli package lint", + "start": "backstage-cli package start", + "test": "backstage-cli package test", "build-image": "docker build ../.. -f Dockerfile --tag example-backend" }, "dependencies": { - "@backstage/backend-common": "workspace:^", + "@backstage/backend-defaults": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/backend-tasks": "workspace:^", - "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", - "@backstage/config": "workspace:^", - "@backstage/integration": "workspace:^", "@backstage/plugin-app-backend": "workspace:^", "@backstage/plugin-auth-backend": "workspace:^", + "@backstage/plugin-auth-backend-module-github-provider": "workspace:^", + "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^", + "@backstage/plugin-catalog-backend-module-openapi": "workspace:^", "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^", "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^", - "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-devtools-backend": "workspace:^", - "@backstage/plugin-events-backend": "workspace:^", - "@backstage/plugin-events-node": "workspace:^", "@backstage/plugin-kubernetes-backend": "workspace:^", + "@backstage/plugin-notifications-backend": "workspace:^", "@backstage/plugin-permission-backend": "workspace:^", + "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-permission-node": "workspace:^", "@backstage/plugin-proxy-backend": "workspace:^", "@backstage/plugin-scaffolder-backend": "workspace:^", - "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "workspace:^", - "@backstage/plugin-scaffolder-backend-module-gitlab": "workspace:^", - "@backstage/plugin-scaffolder-backend-module-notifications": "workspace:^", - "@backstage/plugin-scaffolder-backend-module-rails": "workspace:^", + "@backstage/plugin-scaffolder-backend-module-github": "workspace:^", "@backstage/plugin-search-backend": "workspace:^", "@backstage/plugin-search-backend-module-catalog": "workspace:^", - "@backstage/plugin-search-backend-module-elasticsearch": "workspace:^", "@backstage/plugin-search-backend-module-explore": "workspace:^", - "@backstage/plugin-search-backend-module-pg": "workspace:^", "@backstage/plugin-search-backend-module-techdocs": "workspace:^", "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-signals-backend": "workspace:^", - "@backstage/plugin-signals-node": "workspace:^", - "@backstage/plugin-techdocs-backend": "workspace:^", - "@gitbeaker/node": "^35.1.0", - "@octokit/rest": "^19.0.3", - "@opentelemetry/api": "^1.4.1", - "@opentelemetry/exporter-prometheus": "^0.50.0", - "@opentelemetry/sdk-metrics": "^1.13.0", - "azure-devops-node-api": "^12.0.0", - "better-sqlite3": "^9.0.0", - "dockerode": "^4.0.0", - "example-app": "link:../app", - "express": "^4.17.1", - "express-prom-bundle": "^7.0.0", - "express-promise-router": "^4.1.0", - "luxon": "^3.0.0", - "mysql2": "^3.0.0", - "pg": "^8.11.3", - "pg-connection-string": "^2.3.0", - "prom-client": "^15.0.0", - "winston": "^3.2.1" + "@backstage/plugin-techdocs-backend": "workspace:^" }, "devDependencies": { - "@backstage/cli": "workspace:^", - "@types/dockerode": "^3.3.0", - "@types/express": "^4.17.6", - "@types/express-serve-static-core": "^4.17.5", - "@types/luxon": "^3.0.0" + "@backstage/cli": "workspace:^" }, "files": [ "dist" diff --git a/packages/backend-next/src/authModuleGithubProvider.ts b/packages/backend/src/authModuleGithubProvider.ts similarity index 100% rename from packages/backend-next/src/authModuleGithubProvider.ts rename to packages/backend/src/authModuleGithubProvider.ts diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 34ea8b0f6c..a4acd19cf2 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -14,171 +14,38 @@ * limitations under the License. */ -/* - * Hi! - * - * Note that this is an EXAMPLE Backstage backend. Please check the README. - * - * Happy hacking! - */ +import { createBackend } from '@backstage/backend-defaults'; -import Router from 'express-promise-router'; -import { - CacheManager, - createServiceBuilder, - DatabaseManager, - getRootLogger, - HostDiscovery, - loadBackendConfig, - notFoundHandler, - ServerTokenManager, - UrlReaders, - useHotMemoize, -} from '@backstage/backend-common'; -import { TaskScheduler } from '@backstage/backend-tasks'; -import { Config } from '@backstage/config'; -import healthcheck from './plugins/healthcheck'; -import { metricsHandler, metricsInit } from './metrics'; -import auth from './plugins/auth'; -import catalog from './plugins/catalog'; -import events from './plugins/events'; -import kubernetes from './plugins/kubernetes'; -import scaffolder from './plugins/scaffolder'; -import proxy from './plugins/proxy'; -import search from './plugins/search'; -import techdocs from './plugins/techdocs'; -import app from './plugins/app'; -import permission from './plugins/permission'; -import signals from './plugins/signals'; -import devtools from './plugins/devtools'; -import { PluginEnvironment } from './types'; -import { ServerPermissionClient } from '@backstage/plugin-permission-node'; -import { DefaultIdentityClient } from '@backstage/plugin-auth-node'; -import { DefaultEventBroker } from '@backstage/plugin-events-backend'; -import { DefaultEventsService } from '@backstage/plugin-events-node'; -import { PrometheusExporter } from '@opentelemetry/exporter-prometheus'; -import { MeterProvider } from '@opentelemetry/sdk-metrics'; -import { metrics } from '@opentelemetry/api'; -import { DefaultSignalsService } from '@backstage/plugin-signals-node'; +const backend = createBackend(); -// Expose opentelemetry metrics using a Prometheus exporter on -// http://localhost:9464/metrics . See prometheus.yml in packages/backend for -// more information on how to scrape it. -const exporter = new PrometheusExporter(); -const meterProvider = new MeterProvider(); -metrics.setGlobalMeterProvider(meterProvider); -meterProvider.addMetricReader(exporter); +backend.add(import('@backstage/plugin-auth-backend')); +backend.add(import('./authModuleGithubProvider')); +backend.add(import('@backstage/plugin-auth-backend-module-guest-provider')); -function makeCreateEnv(config: Config) { - const root = getRootLogger(); - const reader = UrlReaders.default({ logger: root, config }); - const discovery = HostDiscovery.fromConfig(config); - const tokenManager = ServerTokenManager.fromConfig(config, { logger: root }); - const permissions = ServerPermissionClient.fromConfig(config, { - discovery, - tokenManager, - }); - const databaseManager = DatabaseManager.fromConfig(config, { logger: root }); - const cacheManager = CacheManager.fromConfig(config); - const taskScheduler = TaskScheduler.fromConfig(config, { databaseManager }); - const identity = DefaultIdentityClient.create({ - discovery, - }); +backend.add(import('@backstage/plugin-app-backend/alpha')); +backend.add(import('@backstage/plugin-catalog-backend-module-unprocessed')); +backend.add( + import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model'), +); +backend.add(import('@backstage/plugin-catalog-backend/alpha')); +backend.add(import('@backstage/plugin-devtools-backend')); +backend.add(import('@backstage/plugin-kubernetes-backend/alpha')); +backend.add( + import('@backstage/plugin-permission-backend-module-allow-all-policy'), +); +backend.add(import('@backstage/plugin-permission-backend/alpha')); +backend.add(import('@backstage/plugin-proxy-backend/alpha')); +backend.add(import('@backstage/plugin-scaffolder-backend/alpha')); +backend.add(import('@backstage/plugin-scaffolder-backend-module-github')); +backend.add(import('@backstage/plugin-search-backend-module-catalog/alpha')); +backend.add(import('@backstage/plugin-search-backend-module-explore/alpha')); +backend.add(import('@backstage/plugin-search-backend-module-techdocs/alpha')); +backend.add( + import('@backstage/plugin-catalog-backend-module-backstage-openapi'), +); +backend.add(import('@backstage/plugin-search-backend/alpha')); +backend.add(import('@backstage/plugin-techdocs-backend/alpha')); +backend.add(import('@backstage/plugin-signals-backend')); +backend.add(import('@backstage/plugin-notifications-backend')); - const eventsService = DefaultEventsService.create({ logger: root }); - const eventBroker = new DefaultEventBroker( - root.child({ type: 'plugin' }), - eventsService, - ); - const signalsService = DefaultSignalsService.create({ - events: eventsService, - }); - - root.info(`Created UrlReader ${reader}`); - - return (plugin: string): PluginEnvironment => { - const logger = root.child({ type: 'plugin', plugin }); - const database = databaseManager.forPlugin(plugin); - const cache = cacheManager.forPlugin(plugin); - const scheduler = taskScheduler.forPlugin(plugin); - - return { - logger, - cache, - database, - config, - reader, - eventBroker, - events: eventsService, - discovery, - tokenManager, - permissions, - scheduler, - identity, - signals: signalsService, - }; - }; -} - -async function main() { - metricsInit(); - const logger = getRootLogger(); - - logger.info( - `You are running an example backend, which is supposed to be mainly used for contributing back to Backstage. ` + - `Do NOT deploy this to production. Read more here https://backstage.io/docs/getting-started/`, - ); - - const config = await loadBackendConfig({ - argv: process.argv, - logger, - }); - - const createEnv = makeCreateEnv(config); - - const healthcheckEnv = useHotMemoize(module, () => createEnv('healthcheck')); - const catalogEnv = useHotMemoize(module, () => createEnv('catalog')); - const scaffolderEnv = useHotMemoize(module, () => createEnv('scaffolder')); - const authEnv = useHotMemoize(module, () => createEnv('auth')); - const proxyEnv = useHotMemoize(module, () => createEnv('proxy')); - const searchEnv = useHotMemoize(module, () => createEnv('search')); - const techdocsEnv = useHotMemoize(module, () => createEnv('techdocs')); - const kubernetesEnv = useHotMemoize(module, () => createEnv('kubernetes')); - const appEnv = useHotMemoize(module, () => createEnv('app')); - const permissionEnv = useHotMemoize(module, () => createEnv('permission')); - const eventsEnv = useHotMemoize(module, () => createEnv('events')); - const devToolsEnv = useHotMemoize(module, () => createEnv('devtools')); - const signalsEnv = useHotMemoize(module, () => createEnv('signals')); - - const apiRouter = Router(); - apiRouter.use('/catalog', await catalog(catalogEnv)); - apiRouter.use('/events', await events(eventsEnv)); - apiRouter.use('/scaffolder', await scaffolder(scaffolderEnv)); - apiRouter.use('/auth', await auth(authEnv)); - apiRouter.use('/search', await search(searchEnv)); - apiRouter.use('/techdocs', await techdocs(techdocsEnv)); - apiRouter.use('/kubernetes', await kubernetes(kubernetesEnv)); - apiRouter.use('/proxy', await proxy(proxyEnv)); - apiRouter.use('/permission', await permission(permissionEnv)); - apiRouter.use('/devtools', await devtools(devToolsEnv)); - apiRouter.use('/signals', await signals(signalsEnv)); - apiRouter.use(notFoundHandler()); - - const service = createServiceBuilder(module) - .loadConfig(config) - .addRouter('', await healthcheck(healthcheckEnv)) - .addRouter('', metricsHandler()) - .addRouter('/api', apiRouter) - .addRouter('', await app(appEnv)); - - await service.start().catch(err => { - logger.error(err); - process.exit(1); - }); -} - -module.hot?.accept(); -main().catch(error => { - console.error('Backend failed to start up', error); - process.exit(1); -}); +backend.start(); diff --git a/plugins/auth-backend/api-report.md b/plugins/auth-backend/api-report.md index d15399d279..edd462b528 100644 --- a/plugins/auth-backend/api-report.md +++ b/plugins/auth-backend/api-report.md @@ -14,7 +14,7 @@ import { AwsAlbResult as AwsAlbResult_2 } from '@backstage/plugin-auth-backend-m import { AzureEasyAuthResult } from '@backstage/plugin-auth-backend-module-azure-easyauth-provider'; import { BackendFeature } from '@backstage/backend-plugin-api'; import { BackstageSignInResult } from '@backstage/plugin-auth-node'; -import { CacheService } from '@backstage/backend-plugin-api'; +import { CacheClient } from '@backstage/backend-common'; import { CatalogApi } from '@backstage/catalog-client'; import { ClientAuthResponse } from '@backstage/plugin-auth-node'; import { cloudflareAccessSignInResolvers } from '@backstage/plugin-auth-backend-module-cloudflare-access-provider'; @@ -452,7 +452,7 @@ export const providers: Readonly<{ signIn: { resolver: SignInResolver_2; }; - cache?: CacheService | undefined; + cache?: CacheClient | undefined; }) => AuthProviderFactory_2; resolvers: Readonly; }>; diff --git a/plugins/catalog-backend-module-unprocessed/README.md b/plugins/catalog-backend-module-unprocessed/README.md index 0d9f9f8cb9..6b350e5ef8 100644 --- a/plugins/catalog-backend-module-unprocessed/README.md +++ b/plugins/catalog-backend-module-unprocessed/README.md @@ -14,7 +14,13 @@ A `pending` entity has not been processed yet. yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-unprocessed ``` -### backend +In `packages/backend/src/index.ts` add the module: + +```ts title="packages/backend/src/index.ts" +backend.add(catalogModuleUnprocessedEntities()); +``` + +### Legacy Backend In `packages/backend/src/plugins/catalog.ts` import the module and initialize it after invoking `CatalogBuilder.build()`: @@ -29,13 +35,3 @@ const unprocessed = new UnprocessedEntitiesModule( ); unprocessed.registerRoutes(); ``` - -### backend-next - -In `packages/backend-next/src/index.ts` add the module: - -```ts title="packages/backend-next/src/index.ts" -backend.add(catalogModuleUnprocessedEntities()); -``` - -_This plugin was created through the Backstage CLI_ diff --git a/plugins/search-backend-module-catalog/README.md b/plugins/search-backend-module-catalog/README.md index cbabe13d6d..925d8d3b09 100644 --- a/plugins/search-backend-module-catalog/README.md +++ b/plugins/search-backend-module-catalog/README.md @@ -14,7 +14,7 @@ yarn --cwd packages/backend add @backstage/plugin-search-backend-module-catalog Add the collator to your backend instance, along with the search plugin itself: ```tsx -// packages/backend-next/src/index.ts +// packages/backend/src/index.ts import { createBackend } from '@backstage/backend-defaults'; import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; import { searchModuleCatalogCollator } from '@backstage/plugin-search-backend-module-catalog/alpha'; @@ -32,7 +32,7 @@ You may also want to add configuration parameters to your app-config, for exampl This module also has an extension point, which lets you inject advanced customizations. Here's an example of how to leverage that extension point to tweak the transformer used for building the search indexer documents: ```tsx -// packages/backend-next/src/index.ts +// packages/backend/src/index.ts import { createBackend } from '@backstage/backend-defaults'; import { createBackendModule } from '@backstage/backend-plugin-api'; import { searchPlugin } from '@backstage/plugin-search-backend/alpha'; diff --git a/yarn.lock b/yarn.lock index f90b972ae7..48db161383 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6695,7 +6695,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-scaffolder-backend-module-notifications@workspace:^, @backstage/plugin-scaffolder-backend-module-notifications@workspace:plugins/scaffolder-backend-module-notifications": +"@backstage/plugin-scaffolder-backend-module-notifications@workspace:plugins/scaffolder-backend-module-notifications": version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-notifications@workspace:plugins/scaffolder-backend-module-notifications" dependencies: @@ -24107,9 +24107,9 @@ __metadata: languageName: unknown linkType: soft -"example-app@link:../app::locator=example-backend%40workspace%3Apackages%2Fbackend": +"example-app@link:../app::locator=example-backend-legacy%40workspace%3Apackages%2Fbackend-legacy": version: 0.0.0-use.local - resolution: "example-app@link:../app::locator=example-backend%40workspace%3Apackages%2Fbackend" + resolution: "example-app@link:../app::locator=example-backend-legacy%40workspace%3Apackages%2Fbackend-legacy" languageName: node linkType: soft @@ -24181,48 +24181,9 @@ __metadata: languageName: unknown linkType: soft -"example-backend-next@workspace:packages/backend-next": +"example-backend-legacy@workspace:packages/backend-legacy": version: 0.0.0-use.local - resolution: "example-backend-next@workspace:packages/backend-next" - dependencies: - "@backstage/backend-defaults": "workspace:^" - "@backstage/backend-plugin-api": "workspace:^" - "@backstage/backend-tasks": "workspace:^" - "@backstage/catalog-model": "workspace:^" - "@backstage/cli": "workspace:^" - "@backstage/plugin-app-backend": "workspace:^" - "@backstage/plugin-auth-backend": "workspace:^" - "@backstage/plugin-auth-backend-module-github-provider": "workspace:^" - "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^" - "@backstage/plugin-auth-node": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" - "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^" - "@backstage/plugin-catalog-backend-module-openapi": "workspace:^" - "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^" - "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^" - "@backstage/plugin-devtools-backend": "workspace:^" - "@backstage/plugin-kubernetes-backend": "workspace:^" - "@backstage/plugin-notifications-backend": "workspace:^" - "@backstage/plugin-permission-backend": "workspace:^" - "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^" - "@backstage/plugin-permission-common": "workspace:^" - "@backstage/plugin-permission-node": "workspace:^" - "@backstage/plugin-proxy-backend": "workspace:^" - "@backstage/plugin-scaffolder-backend": "workspace:^" - "@backstage/plugin-scaffolder-backend-module-github": "workspace:^" - "@backstage/plugin-search-backend": "workspace:^" - "@backstage/plugin-search-backend-module-catalog": "workspace:^" - "@backstage/plugin-search-backend-module-explore": "workspace:^" - "@backstage/plugin-search-backend-module-techdocs": "workspace:^" - "@backstage/plugin-search-backend-node": "workspace:^" - "@backstage/plugin-signals-backend": "workspace:^" - "@backstage/plugin-techdocs-backend": "workspace:^" - languageName: unknown - linkType: soft - -"example-backend@workspace:packages/backend": - version: 0.0.0-use.local - resolution: "example-backend@workspace:packages/backend" + resolution: "example-backend-legacy@workspace:packages/backend-legacy" dependencies: "@backstage/backend-common": "workspace:^" "@backstage/backend-tasks": "workspace:^" @@ -24249,7 +24210,6 @@ __metadata: "@backstage/plugin-scaffolder-backend": "workspace:^" "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "workspace:^" "@backstage/plugin-scaffolder-backend-module-gitlab": "workspace:^" - "@backstage/plugin-scaffolder-backend-module-notifications": "workspace:^" "@backstage/plugin-scaffolder-backend-module-rails": "workspace:^" "@backstage/plugin-search-backend": "workspace:^" "@backstage/plugin-search-backend-module-catalog": "workspace:^" @@ -24286,6 +24246,45 @@ __metadata: languageName: unknown linkType: soft +"example-backend@workspace:packages/backend": + version: 0.0.0-use.local + resolution: "example-backend@workspace:packages/backend" + dependencies: + "@backstage/backend-defaults": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/backend-tasks": "workspace:^" + "@backstage/catalog-model": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/plugin-app-backend": "workspace:^" + "@backstage/plugin-auth-backend": "workspace:^" + "@backstage/plugin-auth-backend-module-github-provider": "workspace:^" + "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^" + "@backstage/plugin-auth-node": "workspace:^" + "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^" + "@backstage/plugin-catalog-backend-module-openapi": "workspace:^" + "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^" + "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^" + "@backstage/plugin-devtools-backend": "workspace:^" + "@backstage/plugin-kubernetes-backend": "workspace:^" + "@backstage/plugin-notifications-backend": "workspace:^" + "@backstage/plugin-permission-backend": "workspace:^" + "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^" + "@backstage/plugin-permission-common": "workspace:^" + "@backstage/plugin-permission-node": "workspace:^" + "@backstage/plugin-proxy-backend": "workspace:^" + "@backstage/plugin-scaffolder-backend": "workspace:^" + "@backstage/plugin-scaffolder-backend-module-github": "workspace:^" + "@backstage/plugin-search-backend": "workspace:^" + "@backstage/plugin-search-backend-module-catalog": "workspace:^" + "@backstage/plugin-search-backend-module-explore": "workspace:^" + "@backstage/plugin-search-backend-module-techdocs": "workspace:^" + "@backstage/plugin-search-backend-node": "workspace:^" + "@backstage/plugin-signals-backend": "workspace:^" + "@backstage/plugin-techdocs-backend": "workspace:^" + languageName: unknown + linkType: soft + "execa@npm:8.0.1": version: 8.0.1 resolution: "execa@npm:8.0.1" From b192752d17f7e9a2a32b0207533f039bece606a6 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 6 May 2024 15:17:14 +0200 Subject: [PATCH 102/136] changesets: added changeset for backend-next readme updates Signed-off-by: Patrik Oldsberg --- .changeset/cold-cougars-float.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/cold-cougars-float.md diff --git a/.changeset/cold-cougars-float.md b/.changeset/cold-cougars-float.md new file mode 100644 index 0000000000..1ddc78a34b --- /dev/null +++ b/.changeset/cold-cougars-float.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-catalog-backend-module-unprocessed': patch +'@backstage/backend-dynamic-feature-service': patch +'@backstage/plugin-search-backend-module-catalog': patch +--- + +Updated `README.md` to point to `packages/backend` instead of `packages/backend-next`. From 42e1628aaf82f7a162aa802d399ca186ff7b452e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 13:29:24 +0000 Subject: [PATCH 103/136] chore(deps): update dependency @types/nodemailer to v6.4.15 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f90b972ae7..d8b86054e3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16311,11 +16311,11 @@ __metadata: linkType: hard "@types/nodemailer@npm:^6.4.14": - version: 6.4.14 - resolution: "@types/nodemailer@npm:6.4.14" + version: 6.4.15 + resolution: "@types/nodemailer@npm:6.4.15" dependencies: "@types/node": "*" - checksum: 5f61f01dd736b17f431d1e8b320322f86460604b45df947fc4bc8999d7c7719405e349f7abba86e4fb100a464a30b52615d00dac03d9cb37562ff04487ebd310 + checksum: f6f9a2f8a669703ecc3ca6359c12345b16f6b2e5691b93c406b9af7de639c02092ec00133526e6fecd8c60d884890a7cd0f967d8e64bedab46d5c3d8be0882d7 languageName: node linkType: hard From 92f925dc3c3d5add5623ea0ab9357fda64a907b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20W=C3=BCrbach?= Date: Mon, 6 May 2024 15:30:11 +0200 Subject: [PATCH 104/136] chore: update humanitec plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Johannes Würbach --- microsite/data/plugins/humanitec.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/microsite/data/plugins/humanitec.yaml b/microsite/data/plugins/humanitec.yaml index 7265b9d917..a94ca431e6 100644 --- a/microsite/data/plugins/humanitec.yaml +++ b/microsite/data/plugins/humanitec.yaml @@ -1,12 +1,12 @@ --- title: Humanitec Platform Orchestrator -author: Frontside -authorUrl: 'https://frontside.com' +author: Humanitec +authorUrl: 'https://humanitec.com' category: Deployment # A single category e.g. CI, Machine Learning, Services, Monitoring description: | Show workloads, environments and resources deployed by Humanitec Platform Orchestrator. Plugin includes an Entity ComponentCard, Backend API route and scaffolder actions. -documentation: https://github.com/thefrontside/playhouse/tree/main/plugins/humanitec +documentation: https://github.com/humanitec/humanitec-backstage-plugins iconUrl: /img/humanitec-logo.png -npmPackageName: '@frontside/backstage-plugin-humanitec' +npmPackageName: '@humanitec/backstage-plugin' addedDate: '2022-06-22' From 08b4c068a06979f01b3942bd241d11f8da3d597e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 13:30:16 +0000 Subject: [PATCH 105/136] chore(deps): update dependency @types/passport-google-oauth20 to v2.0.16 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f90b972ae7..771bd0915d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16378,13 +16378,13 @@ __metadata: linkType: hard "@types/passport-google-oauth20@npm:^2.0.3": - version: 2.0.14 - resolution: "@types/passport-google-oauth20@npm:2.0.14" + version: 2.0.16 + resolution: "@types/passport-google-oauth20@npm:2.0.16" dependencies: "@types/express": "*" "@types/passport": "*" "@types/passport-oauth2": "*" - checksum: 1f013dec6e6b168e7971ae1f7815b5eb015830d2da5bdb0d2fc5e3dbdf9ef7e39e2d1c62495a50d763abda9b59f7c1e35f83945ddfc309ba74cb46695da4a792 + checksum: 721163b179efd43dba861d8ce36687d58278d3aa30207f5b2e7a05f41814ea0b89edae062d1c2bfa11a4d28e4259cca423c6e53cc30e52402e213b90f5caf705 languageName: node linkType: hard From 7ed2f0d500d95ac46065b4b42d255c9aba0e68fd Mon Sep 17 00:00:00 2001 From: Ken Liang Date: Wed, 1 May 2024 14:51:27 -0400 Subject: [PATCH 106/136] Add additional settings Add squash options and merge method to scaffolder Signed-off-by: Ken Liang Signed-off-by: Zhi Liang --- .../src/actions/gitlab.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts index 22f875ca8d..8649c75323 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts @@ -56,6 +56,8 @@ export function createPublishGitlabAction(options: { auto_devops_enabled?: boolean; ci_config_path?: string; description?: string; + merge_method?: 'merge' | 'rebase_merge' | 'ff'; + squash_option?: 'default_off' | 'default_on' | 'never' | 'always'; topics?: string[]; visibility?: 'private' | 'internal' | 'public'; }; @@ -169,6 +171,16 @@ export function createPublishGitlabAction(options: { description: 'Short project description', type: 'string', }, + merge_method: { + title: 'Merge Method to use', + description: 'Merge Methods (merge, rebase_merge, ff)', + type: 'string', + }, + squash_option: { + title: 'Squash option', + description: 'Set squash option for the project (never, always, default_on, default_off', + type: 'string', + }, topics: { title: 'Topic labels', description: 'Topic labels to apply on the repository', From f884b3d6ab47dd304166da0db0cf4c975e74136e Mon Sep 17 00:00:00 2001 From: Zhi Liang Date: Wed, 1 May 2024 15:33:54 -0400 Subject: [PATCH 107/136] add example for ff merge and squash Signed-off-by: Zhi Liang --- .../src/actions/gitlab.examples.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.examples.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.examples.ts index ad032e9017..534177abf6 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.examples.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.examples.ts @@ -87,6 +87,25 @@ export const examples: TemplateExample[] = [ ], }), }, + { + description: 'Initializes a GitLab repository with fast forward merge and always squash settings.', + example: yaml.stringify({ + steps: [ + { + id: 'publish', + action: 'publish:gitlab', + name: 'Publish to GitLab', + input: { + repoUrl: 'gitlab.com?repo=project_name&owner=group_name', + settings: { + merge_method: 'ff', + squash_option: 'always', + }, + }, + }, + ], + }), + }, { description: 'Initializes a GitLab repository with branch settings.', example: yaml.stringify({ From e11a28631a9f3e969270702386e3cbd2e98edb42 Mon Sep 17 00:00:00 2001 From: Zhi Liang Date: Wed, 1 May 2024 15:35:01 -0400 Subject: [PATCH 108/136] fix up enum and typos Signed-off-by: Zhi Liang --- .../scaffolder-backend-module-gitlab/src/actions/gitlab.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts index 8649c75323..3dd6cb324d 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts @@ -175,11 +175,13 @@ export function createPublishGitlabAction(options: { title: 'Merge Method to use', description: 'Merge Methods (merge, rebase_merge, ff)', type: 'string', + enum: ['merge', 'rebase_merge', 'ff'], }, squash_option: { title: 'Squash option', - description: 'Set squash option for the project (never, always, default_on, default_off', + description: 'Set squash option for the project (never, always, default_on, default_off)', type: 'string', + enum: ['default_off', 'default_on', 'never', 'always'], }, topics: { title: 'Topic labels', From 69c57590850f0abeb182d059a9cc8a649d3dc6d7 Mon Sep 17 00:00:00 2001 From: Zhi Liang Date: Wed, 1 May 2024 18:11:39 -0400 Subject: [PATCH 109/136] prettier Signed-off-by: Zhi Liang --- .../src/actions/gitlab.examples.ts | 3 ++- plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.examples.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.examples.ts index 534177abf6..9746bfabe2 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.examples.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.examples.ts @@ -88,7 +88,8 @@ export const examples: TemplateExample[] = [ }), }, { - description: 'Initializes a GitLab repository with fast forward merge and always squash settings.', + description: + 'Initializes a GitLab repository with fast forward merge and always squash settings.', example: yaml.stringify({ steps: [ { diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts index 3dd6cb324d..020e8a9c18 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts @@ -179,7 +179,8 @@ export function createPublishGitlabAction(options: { }, squash_option: { title: 'Squash option', - description: 'Set squash option for the project (never, always, default_on, default_off)', + description: + 'Set squash option for the project (never, always, default_on, default_off)', type: 'string', enum: ['default_off', 'default_on', 'never', 'always'], }, From 8fa8a00916413909c12c142dd6c9290f7857a076 Mon Sep 17 00:00:00 2001 From: Zhi Liang Date: Wed, 1 May 2024 18:15:19 -0400 Subject: [PATCH 110/136] Add merge_method and squash_option for project creation Signed-off-by: Zhi Liang --- .changeset/dirty-chairs-march.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dirty-chairs-march.md diff --git a/.changeset/dirty-chairs-march.md b/.changeset/dirty-chairs-march.md new file mode 100644 index 0000000000..8b4e677b8a --- /dev/null +++ b/.changeset/dirty-chairs-march.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-gitlab': patch +--- + +Add merge_method and squash_option for project creation From c1483e4b4fad92b9e84c8e0d56f8ba77336dd27e Mon Sep 17 00:00:00 2001 From: Zhi Liang Date: Wed, 1 May 2024 19:05:46 -0400 Subject: [PATCH 111/136] add merge_method and squash_options Signed-off-by: Zhi Liang --- .../api-report.md | 308 ++++++++---------- 1 file changed, 141 insertions(+), 167 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/api-report.md b/plugins/scaffolder-backend-module-gitlab/api-report.md index 4fb965eb13..f054136f94 100644 --- a/plugins/scaffolder-backend-module-gitlab/api-report.md +++ b/plugins/scaffolder-backend-module-gitlab/api-report.md @@ -3,6 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts + import { BackendFeature } from '@backstage/backend-plugin-api'; import { Config } from '@backstage/config'; import { JsonObject } from '@backstage/types'; @@ -11,188 +12,160 @@ import { TemplateAction } from '@backstage/plugin-scaffolder-node'; // @public export const createGitlabGroupEnsureExistsAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< - { - path: string[]; - repoUrl: string; - token?: string | undefined; - }, - { - groupId?: number | undefined; - } ->; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< { +path: string[]; +repoUrl: string; +token?: string | undefined; +}, { +groupId?: number | undefined; +}>; // @public export const createGitlabIssueAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< - { - title: string; - repoUrl: string; - projectId: number; - token?: string | undefined; - assignees?: number[] | undefined; - confidential?: boolean | undefined; - description?: string | undefined; - createdAt?: string | undefined; - dueDate?: string | undefined; - discussionToResolve?: string | undefined; - epicId?: number | undefined; - labels?: string | undefined; - issueType?: IssueType | undefined; - mergeRequestToResolveDiscussionsOf?: number | undefined; - milestoneId?: number | undefined; - weight?: number | undefined; - }, - { - issueUrl: string; - issueId: number; - issueIid: number; - } ->; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< { +title: string; +repoUrl: string; +projectId: number; +token?: string | undefined; +assignees?: number[] | undefined; +confidential?: boolean | undefined; +description?: string | undefined; +createdAt?: string | undefined; +dueDate?: string | undefined; +discussionToResolve?: string | undefined; +epicId?: number | undefined; +labels?: string | undefined; +issueType?: IssueType | undefined; +mergeRequestToResolveDiscussionsOf?: number | undefined; +milestoneId?: number | undefined; +weight?: number | undefined; +}, { +issueUrl: string; +issueId: number; +issueIid: number; +}>; // @public export const createGitlabProjectAccessTokenAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< - { - repoUrl: string; - projectId: string | number; - token?: string | undefined; - name?: string | undefined; - accessLevel?: number | undefined; - scopes?: string[] | undefined; - expiresAt?: string | undefined; - }, - { - access_token: string; - } ->; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< { +repoUrl: string; +projectId: string | number; +token?: string | undefined; +name?: string | undefined; +accessLevel?: number | undefined; +scopes?: string[] | undefined; +expiresAt?: string | undefined; +}, { +access_token: string; +}>; // @public export const createGitlabProjectDeployTokenAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< - { - name: string; - repoUrl: string; - projectId: string | number; - token?: string | undefined; - username?: string | undefined; - scopes?: string[] | undefined; - }, - { - user: string; - deploy_token: string; - } ->; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< { +name: string; +repoUrl: string; +projectId: string | number; +token?: string | undefined; +username?: string | undefined; +scopes?: string[] | undefined; +}, { +user: string; +deploy_token: string; +}>; // @public export const createGitlabProjectVariableAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< - { - key: string; - value: string; - repoUrl: string; - projectId: string | number; - variableType: string; - token?: string | undefined; - variableProtected?: boolean | undefined; - masked?: boolean | undefined; - raw?: boolean | undefined; - environmentScope?: string | undefined; - }, - JsonObject ->; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< { +key: string; +value: string; +repoUrl: string; +projectId: string | number; +variableType: string; +token?: string | undefined; +variableProtected?: boolean | undefined; +masked?: boolean | undefined; +raw?: boolean | undefined; +environmentScope?: string | undefined; +}, JsonObject>; // @public export const createGitlabRepoPushAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< - { - repoUrl: string; - branchName: string; - commitMessage: string; - sourcePath?: string | undefined; - targetPath?: string | undefined; - token?: string | undefined; - commitAction?: 'update' | 'delete' | 'create' | undefined; - }, - JsonObject ->; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< { +repoUrl: string; +branchName: string; +commitMessage: string; +sourcePath?: string | undefined; +targetPath?: string | undefined; +token?: string | undefined; +commitAction?: "update" | "create" | "delete" | undefined; +}, JsonObject>; // @public export function createPublishGitlabAction(options: { - integrations: ScmIntegrationRegistry; - config: Config; -}): TemplateAction< - { - repoUrl: string; - defaultBranch?: string | undefined; - repoVisibility?: 'internal' | 'private' | 'public' | undefined; - sourcePath?: string | undefined; - token?: string | undefined; - gitCommitMessage?: string | undefined; - gitAuthorName?: string | undefined; - gitAuthorEmail?: string | undefined; - setUserAsOwner?: boolean | undefined; - topics?: string[] | undefined; - settings?: - | { - path?: string | undefined; - auto_devops_enabled?: boolean | undefined; - ci_config_path?: string | undefined; - description?: string | undefined; - topics?: string[] | undefined; - visibility?: 'internal' | 'private' | 'public' | undefined; - } - | undefined; - branches?: - | { - name: string; - protect?: boolean | undefined; - create?: boolean | undefined; - ref?: string | undefined; - }[] - | undefined; - projectVariables?: - | { - key: string; - value: string; - description?: string | undefined; - variable_type?: string | undefined; - protected?: boolean | undefined; - masked?: boolean | undefined; - raw?: boolean | undefined; - environment_scope?: string | undefined; - }[] - | undefined; - }, - JsonObject ->; + integrations: ScmIntegrationRegistry; + config: Config; +}): TemplateAction< { +repoUrl: string; +defaultBranch?: string | undefined; +repoVisibility?: "internal" | "private" | "public" | undefined; +sourcePath?: string | undefined; +token?: string | undefined; +gitCommitMessage?: string | undefined; +gitAuthorName?: string | undefined; +gitAuthorEmail?: string | undefined; +setUserAsOwner?: boolean | undefined; +topics?: string[] | undefined; +settings?: { +path?: string | undefined; +auto_devops_enabled?: boolean | undefined; +ci_config_path?: string | undefined; +description?: string | undefined; +merge_method?: "merge" | "ff" | "rebase_merge" | undefined; +squash_option?: "always" | "never" | "default_on" | "default_off" | undefined; +topics?: string[] | undefined; +visibility?: "internal" | "private" | "public" | undefined; +} | undefined; +branches?: { +name: string; +protect?: boolean | undefined; +create?: boolean | undefined; +ref?: string | undefined; +}[] | undefined; +projectVariables?: { +key: string; +value: string; +description?: string | undefined; +variable_type?: string | undefined; +protected?: boolean | undefined; +masked?: boolean | undefined; +raw?: boolean | undefined; +environment_scope?: string | undefined; +}[] | undefined; +}, JsonObject>; // @public export const createPublishGitlabMergeRequestAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< - { - repoUrl: string; - title: string; - description: string; - branchName: string; - targetBranchName?: string | undefined; - sourcePath?: string | undefined; - targetPath?: string | undefined; - token?: string | undefined; - commitAction?: 'update' | 'delete' | 'create' | undefined; - projectid?: string | undefined; - removeSourceBranch?: boolean | undefined; - assignee?: string | undefined; - }, - JsonObject ->; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< { +repoUrl: string; +title: string; +description: string; +branchName: string; +targetBranchName?: string | undefined; +sourcePath?: string | undefined; +targetPath?: string | undefined; +token?: string | undefined; +commitAction?: "update" | "create" | "delete" | undefined; +projectid?: string | undefined; +removeSourceBranch?: boolean | undefined; +assignee?: string | undefined; +}, JsonObject>; // @public const gitlabModule: () => BackendFeature; @@ -200,11 +173,12 @@ export default gitlabModule; // @public export enum IssueType { - // (undocumented) - INCIDENT = 'incident', - // (undocumented) - ISSUE = 'issue', - // (undocumented) - TEST = 'test_case', + // (undocumented) + INCIDENT = "incident", + // (undocumented) + ISSUE = "issue", + // (undocumented) + TEST = "test_case" } + ``` From f5f7edafd613e28efbd1eb0f685c5f76238d6412 Mon Sep 17 00:00:00 2001 From: Zhi Liang Date: Wed, 1 May 2024 19:22:17 -0400 Subject: [PATCH 112/136] fix changelog method Signed-off-by: Zhi Liang --- .changeset/dirty-chairs-march.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/dirty-chairs-march.md b/.changeset/dirty-chairs-march.md index 8b4e677b8a..c4e22657a6 100644 --- a/.changeset/dirty-chairs-march.md +++ b/.changeset/dirty-chairs-march.md @@ -2,4 +2,4 @@ '@backstage/plugin-scaffolder-backend-module-gitlab': patch --- -Add merge_method and squash_option for project creation +Add merge method and squash option for project creation From 31695c4a13b6a0fe78a048a8b82c7e94aa8a86ce Mon Sep 17 00:00:00 2001 From: Zhi Liang Date: Thu, 2 May 2024 10:09:48 -0400 Subject: [PATCH 113/136] fix prettier formatting Signed-off-by: Zhi Liang --- .../api-report.md | 315 ++++++++++-------- 1 file changed, 174 insertions(+), 141 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/api-report.md b/plugins/scaffolder-backend-module-gitlab/api-report.md index f054136f94..1f43509047 100644 --- a/plugins/scaffolder-backend-module-gitlab/api-report.md +++ b/plugins/scaffolder-backend-module-gitlab/api-report.md @@ -3,7 +3,6 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts - import { BackendFeature } from '@backstage/backend-plugin-api'; import { Config } from '@backstage/config'; import { JsonObject } from '@backstage/types'; @@ -12,160 +11,195 @@ import { TemplateAction } from '@backstage/plugin-scaffolder-node'; // @public export const createGitlabGroupEnsureExistsAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< { -path: string[]; -repoUrl: string; -token?: string | undefined; -}, { -groupId?: number | undefined; -}>; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< + { + path: string[]; + repoUrl: string; + token?: string | undefined; + }, + { + groupId?: number | undefined; + } +>; // @public export const createGitlabIssueAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< { -title: string; -repoUrl: string; -projectId: number; -token?: string | undefined; -assignees?: number[] | undefined; -confidential?: boolean | undefined; -description?: string | undefined; -createdAt?: string | undefined; -dueDate?: string | undefined; -discussionToResolve?: string | undefined; -epicId?: number | undefined; -labels?: string | undefined; -issueType?: IssueType | undefined; -mergeRequestToResolveDiscussionsOf?: number | undefined; -milestoneId?: number | undefined; -weight?: number | undefined; -}, { -issueUrl: string; -issueId: number; -issueIid: number; -}>; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< + { + title: string; + repoUrl: string; + projectId: number; + token?: string | undefined; + assignees?: number[] | undefined; + confidential?: boolean | undefined; + description?: string | undefined; + createdAt?: string | undefined; + dueDate?: string | undefined; + discussionToResolve?: string | undefined; + epicId?: number | undefined; + labels?: string | undefined; + issueType?: IssueType | undefined; + mergeRequestToResolveDiscussionsOf?: number | undefined; + milestoneId?: number | undefined; + weight?: number | undefined; + }, + { + issueUrl: string; + issueId: number; + issueIid: number; + } +>; // @public export const createGitlabProjectAccessTokenAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< { -repoUrl: string; -projectId: string | number; -token?: string | undefined; -name?: string | undefined; -accessLevel?: number | undefined; -scopes?: string[] | undefined; -expiresAt?: string | undefined; -}, { -access_token: string; -}>; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< + { + repoUrl: string; + projectId: string | number; + token?: string | undefined; + name?: string | undefined; + accessLevel?: number | undefined; + scopes?: string[] | undefined; + expiresAt?: string | undefined; + }, + { + access_token: string; + } +>; // @public export const createGitlabProjectDeployTokenAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< { -name: string; -repoUrl: string; -projectId: string | number; -token?: string | undefined; -username?: string | undefined; -scopes?: string[] | undefined; -}, { -user: string; -deploy_token: string; -}>; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< + { + name: string; + repoUrl: string; + projectId: string | number; + token?: string | undefined; + username?: string | undefined; + scopes?: string[] | undefined; + }, + { + user: string; + deploy_token: string; + } +>; // @public export const createGitlabProjectVariableAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< { -key: string; -value: string; -repoUrl: string; -projectId: string | number; -variableType: string; -token?: string | undefined; -variableProtected?: boolean | undefined; -masked?: boolean | undefined; -raw?: boolean | undefined; -environmentScope?: string | undefined; -}, JsonObject>; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< + { + key: string; + value: string; + repoUrl: string; + projectId: string | number; + variableType: string; + token?: string | undefined; + variableProtected?: boolean | undefined; + masked?: boolean | undefined; + raw?: boolean | undefined; + environmentScope?: string | undefined; + }, + JsonObject +>; // @public export const createGitlabRepoPushAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< { -repoUrl: string; -branchName: string; -commitMessage: string; -sourcePath?: string | undefined; -targetPath?: string | undefined; -token?: string | undefined; -commitAction?: "update" | "create" | "delete" | undefined; -}, JsonObject>; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< + { + repoUrl: string; + branchName: string; + commitMessage: string; + sourcePath?: string | undefined; + targetPath?: string | undefined; + token?: string | undefined; + commitAction?: 'update' | 'create' | 'delete' | undefined; + }, + JsonObject +>; // @public export function createPublishGitlabAction(options: { - integrations: ScmIntegrationRegistry; - config: Config; -}): TemplateAction< { -repoUrl: string; -defaultBranch?: string | undefined; -repoVisibility?: "internal" | "private" | "public" | undefined; -sourcePath?: string | undefined; -token?: string | undefined; -gitCommitMessage?: string | undefined; -gitAuthorName?: string | undefined; -gitAuthorEmail?: string | undefined; -setUserAsOwner?: boolean | undefined; -topics?: string[] | undefined; -settings?: { -path?: string | undefined; -auto_devops_enabled?: boolean | undefined; -ci_config_path?: string | undefined; -description?: string | undefined; -merge_method?: "merge" | "ff" | "rebase_merge" | undefined; -squash_option?: "always" | "never" | "default_on" | "default_off" | undefined; -topics?: string[] | undefined; -visibility?: "internal" | "private" | "public" | undefined; -} | undefined; -branches?: { -name: string; -protect?: boolean | undefined; -create?: boolean | undefined; -ref?: string | undefined; -}[] | undefined; -projectVariables?: { -key: string; -value: string; -description?: string | undefined; -variable_type?: string | undefined; -protected?: boolean | undefined; -masked?: boolean | undefined; -raw?: boolean | undefined; -environment_scope?: string | undefined; -}[] | undefined; -}, JsonObject>; + integrations: ScmIntegrationRegistry; + config: Config; +}): TemplateAction< + { + repoUrl: string; + defaultBranch?: string | undefined; + repoVisibility?: 'internal' | 'private' | 'public' | undefined; + sourcePath?: string | undefined; + token?: string | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + setUserAsOwner?: boolean | undefined; + topics?: string[] | undefined; + settings?: + | { + path?: string | undefined; + auto_devops_enabled?: boolean | undefined; + ci_config_path?: string | undefined; + description?: string | undefined; + merge_method?: 'merge' | 'ff' | 'rebase_merge' | undefined; + squash_option?: + | 'always' + | 'never' + | 'default_on' + | 'default_off' + | undefined; + topics?: string[] | undefined; + visibility?: 'internal' | 'private' | 'public' | undefined; + } + | undefined; + branches?: + | { + name: string; + protect?: boolean | undefined; + create?: boolean | undefined; + ref?: string | undefined; + }[] + | undefined; + projectVariables?: + | { + key: string; + value: string; + description?: string | undefined; + variable_type?: string | undefined; + protected?: boolean | undefined; + masked?: boolean | undefined; + raw?: boolean | undefined; + environment_scope?: string | undefined; + }[] + | undefined; + }, + JsonObject +>; // @public export const createPublishGitlabMergeRequestAction: (options: { - integrations: ScmIntegrationRegistry; -}) => TemplateAction< { -repoUrl: string; -title: string; -description: string; -branchName: string; -targetBranchName?: string | undefined; -sourcePath?: string | undefined; -targetPath?: string | undefined; -token?: string | undefined; -commitAction?: "update" | "create" | "delete" | undefined; -projectid?: string | undefined; -removeSourceBranch?: boolean | undefined; -assignee?: string | undefined; -}, JsonObject>; + integrations: ScmIntegrationRegistry; +}) => TemplateAction< + { + repoUrl: string; + title: string; + description: string; + branchName: string; + targetBranchName?: string | undefined; + sourcePath?: string | undefined; + targetPath?: string | undefined; + token?: string | undefined; + commitAction?: 'update' | 'create' | 'delete' | undefined; + projectid?: string | undefined; + removeSourceBranch?: boolean | undefined; + assignee?: string | undefined; + }, + JsonObject +>; // @public const gitlabModule: () => BackendFeature; @@ -173,12 +207,11 @@ export default gitlabModule; // @public export enum IssueType { - // (undocumented) - INCIDENT = "incident", - // (undocumented) - ISSUE = "issue", - // (undocumented) - TEST = "test_case" + // (undocumented) + INCIDENT = 'incident', + // (undocumented) + ISSUE = 'issue', + // (undocumented) + TEST = 'test_case', } - ``` From f73bd268715c913f68375517e230108e2ba997df Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 6 May 2024 15:40:07 +0200 Subject: [PATCH 114/136] chore: update api-reports Signed-off-by: blam --- plugins/scaffolder-backend-module-gitlab/api-report.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/api-report.md b/plugins/scaffolder-backend-module-gitlab/api-report.md index 1f43509047..ca98aa558b 100644 --- a/plugins/scaffolder-backend-module-gitlab/api-report.md +++ b/plugins/scaffolder-backend-module-gitlab/api-report.md @@ -118,7 +118,7 @@ export const createGitlabRepoPushAction: (options: { sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; - commitAction?: 'update' | 'create' | 'delete' | undefined; + commitAction?: 'update' | 'delete' | 'create' | undefined; }, JsonObject >; @@ -193,7 +193,7 @@ export const createPublishGitlabMergeRequestAction: (options: { sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; - commitAction?: 'update' | 'create' | 'delete' | undefined; + commitAction?: 'update' | 'delete' | 'create' | undefined; projectid?: string | undefined; removeSourceBranch?: boolean | undefined; assignee?: string | undefined; From e0a1653eb49e9c0ac05c91ba5425ef451b305c13 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 6 May 2024 15:47:01 +0200 Subject: [PATCH 115/136] chore: api-report updates Signed-off-by: blam --- .../api-report.md | 24 +++++------ plugins/scaffolder-backend/api-report.md | 6 +-- plugins/scaffolder/api-report.md | 42 +++++++++---------- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/plugins/scaffolder-backend-module-gitlab/api-report.md b/plugins/scaffolder-backend-module-gitlab/api-report.md index 4fb965eb13..ac4c45f07d 100644 --- a/plugins/scaffolder-backend-module-gitlab/api-report.md +++ b/plugins/scaffolder-backend-module-gitlab/api-report.md @@ -31,19 +31,19 @@ export const createGitlabIssueAction: (options: { title: string; repoUrl: string; projectId: number; + labels?: string | undefined; + description?: string | undefined; + weight?: number | undefined; token?: string | undefined; assignees?: number[] | undefined; - confidential?: boolean | undefined; - description?: string | undefined; createdAt?: string | undefined; + confidential?: boolean | undefined; + milestoneId?: number | undefined; + epicId?: number | undefined; dueDate?: string | undefined; discussionToResolve?: string | undefined; - epicId?: number | undefined; - labels?: string | undefined; issueType?: IssueType | undefined; mergeRequestToResolveDiscussionsOf?: number | undefined; - milestoneId?: number | undefined; - weight?: number | undefined; }, { issueUrl: string; @@ -59,11 +59,11 @@ export const createGitlabProjectAccessTokenAction: (options: { { repoUrl: string; projectId: string | number; - token?: string | undefined; name?: string | undefined; - accessLevel?: number | undefined; + token?: string | undefined; scopes?: string[] | undefined; expiresAt?: string | undefined; + accessLevel?: number | undefined; }, { access_token: string; @@ -78,8 +78,8 @@ export const createGitlabProjectDeployTokenAction: (options: { name: string; repoUrl: string; projectId: string | number; - token?: string | undefined; username?: string | undefined; + token?: string | undefined; scopes?: string[] | undefined; }, { @@ -98,11 +98,11 @@ export const createGitlabProjectVariableAction: (options: { repoUrl: string; projectId: string | number; variableType: string; - token?: string | undefined; - variableProtected?: boolean | undefined; - masked?: boolean | undefined; raw?: boolean | undefined; + token?: string | undefined; + masked?: boolean | undefined; environmentScope?: string | undefined; + variableProtected?: boolean | undefined; }, JsonObject >; diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 6af1ac04a6..9de99c7a5b 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -136,15 +136,15 @@ export function createFetchCatalogEntityAction(options: { auth?: AuthService; }): TemplateAction_2< { - entityRef?: string | undefined; - entityRefs?: string[] | undefined; optional?: boolean | undefined; defaultKind?: string | undefined; defaultNamespace?: string | undefined; + entityRef?: string | undefined; + entityRefs?: string[] | undefined; }, { - entity?: any; entities?: any[] | undefined; + entity?: any; } >; diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index ccea88e27c..5c766af890 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -79,10 +79,10 @@ export const EntityNamePickerFieldExtension: FieldExtensionComponent_2< export const EntityPickerFieldExtension: FieldExtensionComponent_2< string, { - allowedKinds?: string[] | undefined; defaultKind?: string | undefined; - allowArbitraryValues?: boolean | undefined; defaultNamespace?: string | false | undefined; + allowedKinds?: string[] | undefined; + allowArbitraryValues?: boolean | undefined; catalogFilter?: | Record< string, @@ -108,10 +108,10 @@ export const EntityPickerFieldExtension: FieldExtensionComponent_2< export const EntityPickerFieldSchema: FieldSchema< string, { - allowedKinds?: string[] | undefined; defaultKind?: string | undefined; - allowArbitraryValues?: boolean | undefined; defaultNamespace?: string | false | undefined; + allowedKinds?: string[] | undefined; + allowArbitraryValues?: boolean | undefined; catalogFilter?: | Record< string, @@ -141,9 +141,9 @@ export type EntityPickerUiOptions = export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2< string[], { - kinds?: string[] | undefined; - showCounts?: boolean | undefined; helperText?: string | undefined; + showCounts?: boolean | undefined; + kinds?: string[] | undefined; } >; @@ -151,9 +151,9 @@ export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2< export const EntityTagsPickerFieldSchema: FieldSchema< string[], { - kinds?: string[] | undefined; - showCounts?: boolean | undefined; helperText?: string | undefined; + showCounts?: boolean | undefined; + kinds?: string[] | undefined; } >; @@ -215,8 +215,8 @@ export const MultiEntityPickerFieldExtension: FieldExtensionComponent_2< string[], { defaultKind?: string | undefined; - allowArbitraryValues?: boolean | undefined; defaultNamespace?: string | false | undefined; + allowArbitraryValues?: boolean | undefined; catalogFilter?: | Record< string, @@ -267,10 +267,10 @@ export type MyGroupsPickerUiOptions = export const OwnedEntityPickerFieldExtension: FieldExtensionComponent_2< string, { - allowedKinds?: string[] | undefined; defaultKind?: string | undefined; - allowArbitraryValues?: boolean | undefined; defaultNamespace?: string | false | undefined; + allowedKinds?: string[] | undefined; + allowArbitraryValues?: boolean | undefined; catalogFilter?: | Record< string, @@ -296,10 +296,10 @@ export const OwnedEntityPickerFieldExtension: FieldExtensionComponent_2< export const OwnedEntityPickerFieldSchema: FieldSchema< string, { - allowedKinds?: string[] | undefined; defaultKind?: string | undefined; - allowArbitraryValues?: boolean | undefined; defaultNamespace?: string | false | undefined; + allowedKinds?: string[] | undefined; + allowArbitraryValues?: boolean | undefined; catalogFilter?: | Record< string, @@ -329,9 +329,9 @@ export type OwnedEntityPickerUiOptions = export const OwnerPickerFieldExtension: FieldExtensionComponent_2< string, { + defaultNamespace?: string | false | undefined; allowedKinds?: string[] | undefined; allowArbitraryValues?: boolean | undefined; - defaultNamespace?: string | false | undefined; catalogFilter?: | Record< string, @@ -357,9 +357,9 @@ export const OwnerPickerFieldExtension: FieldExtensionComponent_2< export const OwnerPickerFieldSchema: FieldSchema< string, { + defaultNamespace?: string | false | undefined; allowedKinds?: string[] | undefined; allowArbitraryValues?: boolean | undefined; - defaultNamespace?: string | false | undefined; catalogFilter?: | Record< string, @@ -407,12 +407,12 @@ export const RepoUrlPickerFieldExtension: FieldExtensionComponent_2< secretsKey: string; additionalScopes?: | { - gitea?: string[] | undefined; - gerrit?: string[] | undefined; + azure?: string[] | undefined; github?: string[] | undefined; gitlab?: string[] | undefined; bitbucket?: string[] | undefined; - azure?: string[] | undefined; + gerrit?: string[] | undefined; + gitea?: string[] | undefined; } | undefined; } @@ -434,12 +434,12 @@ export const RepoUrlPickerFieldSchema: FieldSchema< secretsKey: string; additionalScopes?: | { - gitea?: string[] | undefined; - gerrit?: string[] | undefined; + azure?: string[] | undefined; github?: string[] | undefined; gitlab?: string[] | undefined; bitbucket?: string[] | undefined; - azure?: string[] | undefined; + gerrit?: string[] | undefined; + gitea?: string[] | undefined; } | undefined; } From 1cda362e8497a7b5c7dd1889eddc3b8ef974f922 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 14:15:52 +0000 Subject: [PATCH 116/136] chore(deps): update dependency @types/pg to v8.11.6 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3e3d6127f0..20f60491e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16438,13 +16438,13 @@ __metadata: linkType: hard "@types/pg@npm:^8.6.6": - version: 8.11.5 - resolution: "@types/pg@npm:8.11.5" + version: 8.11.6 + resolution: "@types/pg@npm:8.11.6" dependencies: "@types/node": "*" pg-protocol: "*" pg-types: ^4.0.1 - checksum: 7346d3df959a8d279cba581c8ee93ed7e331e516c5d8c6866029b9f70eadecb8400818bdc9994d69dd75ccab5bdb7e5a1fc16897efd2e3033fa1ccecd2d2d31a + checksum: 231f7e5bfe8b4d14cca398d24cd55f4f14f582f815b62059e6f3ee74108cf92089fbd946568ebc35fa402f238ed9c8a8c1e10e7084e83e4ca3aff75957243014 languageName: node linkType: hard From 3112aecb0d7a7d9921eee946ea4e6d6b11bcaddf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 14:32:27 +0000 Subject: [PATCH 117/136] chore(deps): update dependency @types/react-syntax-highlighter to v15.5.13 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3f4442d1e7..b9ded5141c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16564,11 +16564,11 @@ __metadata: linkType: hard "@types/react-syntax-highlighter@npm:^15.0.0": - version: 15.5.11 - resolution: "@types/react-syntax-highlighter@npm:15.5.11" + version: 15.5.13 + resolution: "@types/react-syntax-highlighter@npm:15.5.13" dependencies: "@types/react": "*" - checksum: 8363ded0138963407c909f198ddcac58d9c937b118f16a46fb3e97078dd0c6234746f9efa85f6aa660efebe357bab11047c95b57bd9508dd4b09619b1a237087 + checksum: 55f751c140eb6641b16a5644af3b6fc25223957141085758ae6898948e70eaca33d8276e86e75d5d60939aff63af1d20278aba0d3a25483266f9deee1eb468e3 languageName: node linkType: hard From 83e08347457854d58f4d253abdab6d17784c292c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 15:17:01 +0000 Subject: [PATCH 118/136] chore(deps): update step-security/harden-runner action to v2.7.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/api-breaking-changes-comment.yml | 2 +- .github/workflows/api-breaking-changes.yml | 2 +- .github/workflows/automate_area-labels.yml | 2 +- .github/workflows/automate_changeset_feedback.yml | 2 +- .github/workflows/automate_merge_message.yml | 2 +- .github/workflows/automate_stale.yml | 2 +- .github/workflows/ci-noop.yml | 2 +- .github/workflows/ci.yml | 4 ++-- .github/workflows/cron.yml | 2 +- .github/workflows/deploy_docker-image.yml | 2 +- .github/workflows/deploy_microsite.yml | 2 +- .github/workflows/deploy_nightly.yml | 2 +- .github/workflows/deploy_packages.yml | 2 +- .github/workflows/issue.yaml | 2 +- .github/workflows/pr-review-comment-trigger.yaml | 2 +- .github/workflows/pr-review-comment.yaml | 2 +- .github/workflows/pr.yaml | 2 +- .github/workflows/scorecard.yml | 2 +- .github/workflows/sync_code-formatting.yml | 2 +- .github/workflows/sync_dependabot-changesets.yml | 2 +- .github/workflows/sync_release-manifest.yml | 2 +- .github/workflows/sync_renovate-changesets.yml | 2 +- .github/workflows/sync_snyk-github-issues.yml | 2 +- .github/workflows/sync_snyk-monitor.yml | 2 +- .github/workflows/sync_version-packages.yml | 2 +- .github/workflows/uffizzi-build.yml | 6 +++--- .github/workflows/uffizzi-preview.yaml | 2 +- .github/workflows/verify_accessibility-noop.yml | 2 +- .github/workflows/verify_accessibility.yml | 2 +- .github/workflows/verify_codeql.yml | 2 +- .github/workflows/verify_docs-quality.yml | 2 +- .github/workflows/verify_e2e-kubernetes-noop.yml | 2 +- .github/workflows/verify_e2e-kubernetes.yml | 2 +- .github/workflows/verify_e2e-linux-noop.yml | 2 +- .github/workflows/verify_e2e-linux.yml | 2 +- .github/workflows/verify_e2e-techdocs.yml | 2 +- .github/workflows/verify_e2e-windows-noop.yml | 2 +- .github/workflows/verify_e2e-windows.yml | 2 +- .github/workflows/verify_fossa.yml | 2 +- .github/workflows/verify_microsite-noop.yml | 2 +- .github/workflows/verify_microsite.yml | 2 +- .github/workflows/verify_microsite_accessibility-noop.yml | 2 +- .github/workflows/verify_microsite_accessibility.yml | 2 +- .github/workflows/verify_storybook-noop.yml | 2 +- .github/workflows/verify_storybook.yml | 2 +- .github/workflows/verify_windows.yml | 2 +- 46 files changed, 49 insertions(+), 49 deletions(-) diff --git a/.github/workflows/api-breaking-changes-comment.yml b/.github/workflows/api-breaking-changes-comment.yml index bc90a276f0..9ae32e1d4a 100644 --- a/.github/workflows/api-breaking-changes-comment.yml +++ b/.github/workflows/api-breaking-changes-comment.yml @@ -22,7 +22,7 @@ jobs: action: ${{ steps.event.outputs.ACTION }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/api-breaking-changes.yml b/.github/workflows/api-breaking-changes.yml index ef09fa10ae..84161e3010 100644 --- a/.github/workflows/api-breaking-changes.yml +++ b/.github/workflows/api-breaking-changes.yml @@ -14,7 +14,7 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/automate_area-labels.yml b/.github/workflows/automate_area-labels.yml index 632624bd50..74f577f360 100644 --- a/.github/workflows/automate_area-labels.yml +++ b/.github/workflows/automate_area-labels.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/automate_changeset_feedback.yml b/.github/workflows/automate_changeset_feedback.yml index fefc73bd9f..ef1a258239 100644 --- a/.github/workflows/automate_changeset_feedback.yml +++ b/.github/workflows/automate_changeset_feedback.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/automate_merge_message.yml b/.github/workflows/automate_merge_message.yml index d6520d16a6..dd8895a752 100644 --- a/.github/workflows/automate_merge_message.yml +++ b/.github/workflows/automate_merge_message.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/automate_stale.yml b/.github/workflows/automate_stale.yml index c7674e853d..afb8f3b838 100644 --- a/.github/workflows/automate_stale.yml +++ b/.github/workflows/automate_stale.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/ci-noop.yml b/.github/workflows/ci-noop.yml index 2c66da768f..4dc8594bc9 100644 --- a/.github/workflows/ci-noop.yml +++ b/.github/workflows/ci-noop.yml @@ -40,7 +40,7 @@ jobs: name: Test ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c819ae8130..c538ec8957 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: name: Install ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit @@ -64,7 +64,7 @@ jobs: name: Verify ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml index c32d50ced5..7dcb4a9c0f 100644 --- a/.github/workflows/cron.yml +++ b/.github/workflows/cron.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index 8c263fdd4f..d5f5eee35e 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/deploy_microsite.yml b/.github/workflows/deploy_microsite.yml index b955b39b59..037fb27e8d 100644 --- a/.github/workflows/deploy_microsite.yml +++ b/.github/workflows/deploy_microsite.yml @@ -24,7 +24,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/deploy_nightly.yml b/.github/workflows/deploy_nightly.yml index a3a1b5e283..ab8ea3c773 100644 --- a/.github/workflows/deploy_nightly.yml +++ b/.github/workflows/deploy_nightly.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index 0c44d32384..44222275ad 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -144,7 +144,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml index f8f5efacc4..7afc0a81bb 100644 --- a/.github/workflows/issue.yaml +++ b/.github/workflows/issue.yaml @@ -10,7 +10,7 @@ jobs: if: github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/pr-review-comment-trigger.yaml b/.github/workflows/pr-review-comment-trigger.yaml index 5e7d71cbf4..bea1618608 100644 --- a/.github/workflows/pr-review-comment-trigger.yaml +++ b/.github/workflows/pr-review-comment-trigger.yaml @@ -20,7 +20,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/pr-review-comment.yaml b/.github/workflows/pr-review-comment.yaml index 72256a8c6e..232089e2f3 100644 --- a/.github/workflows/pr-review-comment.yaml +++ b/.github/workflows/pr-review-comment.yaml @@ -17,7 +17,7 @@ jobs: steps: # Inspired by https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#using-data-from-the-triggering-workflow - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 3aa20b1c96..779137b52a 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -18,7 +18,7 @@ jobs: if: github.repository == 'backstage/backstage' && ( github.event.pull_request || github.event.issue.pull_request ) steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 3c36cae863..8a069d476d 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/sync_code-formatting.yml b/.github/workflows/sync_code-formatting.yml index a59eea9c9b..7f10ae60df 100644 --- a/.github/workflows/sync_code-formatting.yml +++ b/.github/workflows/sync_code-formatting.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/sync_dependabot-changesets.yml b/.github/workflows/sync_dependabot-changesets.yml index 88997ea5dd..7c8e634fb8 100644 --- a/.github/workflows/sync_dependabot-changesets.yml +++ b/.github/workflows/sync_dependabot-changesets.yml @@ -11,7 +11,7 @@ jobs: if: github.actor == 'dependabot[bot]' && github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/sync_release-manifest.yml b/.github/workflows/sync_release-manifest.yml index 1549ec0e90..7fe8817731 100644 --- a/.github/workflows/sync_release-manifest.yml +++ b/.github/workflows/sync_release-manifest.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/sync_renovate-changesets.yml b/.github/workflows/sync_renovate-changesets.yml index e95a68ac2f..e1c5656d08 100644 --- a/.github/workflows/sync_renovate-changesets.yml +++ b/.github/workflows/sync_renovate-changesets.yml @@ -11,7 +11,7 @@ jobs: if: github.actor == 'renovate[bot]' && github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml index bebbbc4fbe..1948807215 100644 --- a/.github/workflows/sync_snyk-github-issues.yml +++ b/.github/workflows/sync_snyk-github-issues.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/sync_snyk-monitor.yml b/.github/workflows/sync_snyk-monitor.yml index cb3efcfac3..43c613b641 100644 --- a/.github/workflows/sync_snyk-monitor.yml +++ b/.github/workflows/sync_snyk-monitor.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/sync_version-packages.yml b/.github/workflows/sync_version-packages.yml index 82a0eae7be..ed69fd3c24 100644 --- a/.github/workflows/sync_version-packages.yml +++ b/.github/workflows/sync_version-packages.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/uffizzi-build.yml b/.github/workflows/uffizzi-build.yml index 1a742bdf24..eab0a61e46 100644 --- a/.github/workflows/uffizzi-build.yml +++ b/.github/workflows/uffizzi-build.yml @@ -26,7 +26,7 @@ jobs: tags: ${{ steps.meta.outputs.tags }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit @@ -84,7 +84,7 @@ jobs: - build-backstage steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit @@ -118,7 +118,7 @@ jobs: if: ${{ github.event.action == 'closed' }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml index b4c5aa3caa..8d0f558b1f 100644 --- a/.github/workflows/uffizzi-preview.yaml +++ b/.github/workflows/uffizzi-preview.yaml @@ -23,7 +23,7 @@ jobs: action: ${{ steps.event.outputs.ACTION }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/verify_accessibility-noop.yml b/.github/workflows/verify_accessibility-noop.yml index 07c92b5b5d..7ec67cbf0f 100644 --- a/.github/workflows/verify_accessibility-noop.yml +++ b/.github/workflows/verify_accessibility-noop.yml @@ -26,7 +26,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_accessibility.yml b/.github/workflows/verify_accessibility.yml index b4615fee0a..2c0e10c118 100644 --- a/.github/workflows/verify_accessibility.yml +++ b/.github/workflows/verify_accessibility.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_codeql.yml b/.github/workflows/verify_codeql.yml index 60cb89a045..f028147b85 100644 --- a/.github/workflows/verify_codeql.yml +++ b/.github/workflows/verify_codeql.yml @@ -42,7 +42,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml index 2eb7608ccd..21d3563b57 100644 --- a/.github/workflows/verify_docs-quality.yml +++ b/.github/workflows/verify_docs-quality.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-kubernetes-noop.yml b/.github/workflows/verify_e2e-kubernetes-noop.yml index 8d8b14d5ba..6352abce70 100644 --- a/.github/workflows/verify_e2e-kubernetes-noop.yml +++ b/.github/workflows/verify_e2e-kubernetes-noop.yml @@ -23,7 +23,7 @@ jobs: name: Kubernetes ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-kubernetes.yml b/.github/workflows/verify_e2e-kubernetes.yml index 3c425c25e9..ffaa7971e6 100644 --- a/.github/workflows/verify_e2e-kubernetes.yml +++ b/.github/workflows/verify_e2e-kubernetes.yml @@ -22,7 +22,7 @@ jobs: name: Kubernetes ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-linux-noop.yml b/.github/workflows/verify_e2e-linux-noop.yml index 93d48caf22..2b7eb1d84b 100644 --- a/.github/workflows/verify_e2e-linux-noop.yml +++ b/.github/workflows/verify_e2e-linux-noop.yml @@ -29,7 +29,7 @@ jobs: name: E2E Linux ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index 75c7a800d8..6ff3b9eecf 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -41,7 +41,7 @@ jobs: name: E2E Linux ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-techdocs.yml b/.github/workflows/verify_e2e-techdocs.yml index d5f2594285..ad0950392f 100644 --- a/.github/workflows/verify_e2e-techdocs.yml +++ b/.github/workflows/verify_e2e-techdocs.yml @@ -30,7 +30,7 @@ jobs: name: Techdocs steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-windows-noop.yml b/.github/workflows/verify_e2e-windows-noop.yml index a7ebdba4b5..fd90b86b0d 100644 --- a/.github/workflows/verify_e2e-windows-noop.yml +++ b/.github/workflows/verify_e2e-windows-noop.yml @@ -25,7 +25,7 @@ jobs: name: E2E Windows ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml index a6fa469666..7a823a85e1 100644 --- a/.github/workflows/verify_e2e-windows.yml +++ b/.github/workflows/verify_e2e-windows.yml @@ -31,7 +31,7 @@ jobs: name: E2E Windows ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_fossa.yml b/.github/workflows/verify_fossa.yml index ccc9e4509a..4c9b1516a2 100644 --- a/.github/workflows/verify_fossa.yml +++ b/.github/workflows/verify_fossa.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite-noop.yml b/.github/workflows/verify_microsite-noop.yml index ad3e67ba70..a9a82b140b 100644 --- a/.github/workflows/verify_microsite-noop.yml +++ b/.github/workflows/verify_microsite-noop.yml @@ -21,7 +21,7 @@ jobs: name: Microsite steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index d5cda46253..724fac7fef 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -24,7 +24,7 @@ jobs: name: Microsite steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite_accessibility-noop.yml b/.github/workflows/verify_microsite_accessibility-noop.yml index 4b63dc41cc..8ac2672b22 100644 --- a/.github/workflows/verify_microsite_accessibility-noop.yml +++ b/.github/workflows/verify_microsite_accessibility-noop.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite_accessibility.yml b/.github/workflows/verify_microsite_accessibility.yml index 19417c5cee..af2364e743 100644 --- a/.github/workflows/verify_microsite_accessibility.yml +++ b/.github/workflows/verify_microsite_accessibility.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_storybook-noop.yml b/.github/workflows/verify_storybook-noop.yml index 74aed57f5c..e98da4ae02 100644 --- a/.github/workflows/verify_storybook-noop.yml +++ b/.github/workflows/verify_storybook-noop.yml @@ -28,7 +28,7 @@ jobs: name: Storybook steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_storybook.yml b/.github/workflows/verify_storybook.yml index 6a37f5abb6..3cdb0de344 100644 --- a/.github/workflows/verify_storybook.yml +++ b/.github/workflows/verify_storybook.yml @@ -28,7 +28,7 @@ jobs: name: Storybook steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/verify_windows.yml b/.github/workflows/verify_windows.yml index c7ff8f5ca9..0c54cfb287 100644 --- a/.github/workflows/verify_windows.yml +++ b/.github/workflows/verify_windows.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit From 21aa820c3c186be6e3d41b59f2e009fea9cbc4fa Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Mon, 6 May 2024 18:23:35 +0200 Subject: [PATCH 119/136] wip Signed-off-by: bnechyporenko --- plugins/scaffolder-backend/api-report.md | 11 ++++- plugins/scaffolder-backend/config.d.ts | 5 +++ .../src/scaffolder/tasks/DatabaseTaskStore.ts | 6 +++ .../tasks/NunjucksWorkflowRunner.ts | 1 + .../src/scaffolder/tasks/StorageTaskBroker.ts | 42 +++++++++++++++---- .../src/scaffolder/tasks/types.ts | 2 + plugins/scaffolder-node/api-report.md | 2 + plugins/scaffolder-node/src/tasks/types.ts | 2 + 8 files changed, 63 insertions(+), 8 deletions(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 3ef21f4c98..0c01fd6a9e 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -389,6 +389,8 @@ export class DatabaseTaskStore implements TaskStore { // (undocumented) claimTask(): Promise; // (undocumented) + cleanWorkspace({ taskId }: { taskId: string }): Promise; + // (undocumented) completeTask(options: { taskId: string; status: TaskStatus_2; @@ -540,6 +542,8 @@ export class TaskManager implements TaskContext_2 { // (undocumented) get cancelSignal(): AbortSignal; // (undocumented) + cleanWorkspace?(): Promise; + // (undocumented) complete(result: TaskCompletionState_2, metadata?: JsonObject): Promise; // (undocumented) static create( @@ -548,6 +552,7 @@ export class TaskManager implements TaskContext_2 { abortSignal: AbortSignal, logger: Logger, auth?: AuthService, + config?: Config, ): TaskManager; // (undocumented) get createdBy(): string | undefined; @@ -567,7 +572,9 @@ export class TaskManager implements TaskContext_2 { // (undocumented) getWorkspaceName(): Promise; // (undocumented) - rehydrateWorkspace(options: { + get isWorkspaceSerializationEnabled(): boolean; + // (undocumented) + rehydrateWorkspace?(options: { taskId: string; targetPath: string; }): Promise; @@ -606,6 +613,8 @@ export interface TaskStore { // (undocumented) claimTask(): Promise; // (undocumented) + cleanWorkspace?({ taskId }: { taskId: string }): Promise; + // (undocumented) completeTask(options: { taskId: string; status: TaskStatus; diff --git a/plugins/scaffolder-backend/config.d.ts b/plugins/scaffolder-backend/config.d.ts index 477defe026..754eedb55b 100644 --- a/plugins/scaffolder-backend/config.d.ts +++ b/plugins/scaffolder-backend/config.d.ts @@ -47,6 +47,11 @@ export interface Config { */ EXPERIMENTAL_recoverTasks?: boolean; + /** + * Sets the serialization of the workspace to have an ability to rerun the failed task. + */ + EXPERIMENTAL_workspaceSerialization?: boolean; + /** * Every task which is in progress state and having a last heartbeat longer than a specified timeout is going to * be attempted to recover. diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 792b74e8d2..f6f00b0441 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -522,6 +522,12 @@ export class DatabaseTaskStore implements TaskStore { await restoreWorkspace(options.targetPath, result.workspace); } + async cleanWorkspace({ taskId }: { taskId: string }): Promise { + await this.db('tasks').where({ id: taskId }).update({ + workspace: undefined, + }); + } + async serializeWorkspace(options: { path: string; taskId: string; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index decb05ad88..77097e97ea 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -457,6 +457,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { throw new Error(`Step ${step.name} has been cancelled.`); } + await task.cleanWorkspace?.(); await stepTrack.markSuccessful(); } catch (err) { await taskTrack.markFailed(step, err); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index 51f3afc623..9f8f7df241 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -64,8 +64,16 @@ export class TaskManager implements TaskContext { abortSignal: AbortSignal, logger: Logger, auth?: AuthService, + config?: Config, ) { - const agent = new TaskManager(task, storage, abortSignal, logger, auth); + const agent = new TaskManager( + task, + storage, + abortSignal, + logger, + auth, + config, + ); agent.startTimeout(); return agent; } @@ -77,8 +85,17 @@ export class TaskManager implements TaskContext { private readonly signal: AbortSignal, private readonly logger: Logger, private readonly auth?: AuthService, + private readonly config?: Config, ) {} + get isWorkspaceSerializationEnabled(): boolean { + return ( + this.config?.getOptionalBoolean( + 'scaffolder.EXPERIMENTAL_workspaceSerialization', + ) ?? false + ); + } + get spec() { return this.task.spec; } @@ -99,11 +116,13 @@ export class TaskManager implements TaskContext { return this.task.taskId; } - async rehydrateWorkspace(options: { + async rehydrateWorkspace?(options: { taskId: string; targetPath: string; }): Promise { - return this.storage.rehydrateWorkspace?.(options); + if (this.isWorkspaceSerializationEnabled) { + this.storage.rehydrateWorkspace?.(options); + } } get done() { @@ -152,10 +171,18 @@ export class TaskManager implements TaskContext { } async serializeWorkspace?(options: { path: string }): Promise { - await this.storage.serializeWorkspace?.({ - path: options.path, - taskId: this.task.taskId, - }); + if (this.isWorkspaceSerializationEnabled) { + await this.storage.serializeWorkspace?.({ + path: options.path, + taskId: this.task.taskId, + }); + } + } + + async cleanWorkspace?(): Promise { + if (this.isWorkspaceSerializationEnabled) { + await this.storage.cleanWorkspace?.({ taskId: this.task.taskId }); + } } async complete( @@ -338,6 +365,7 @@ export class StorageTaskBroker implements TaskBroker { abortController.signal, this.logger, this.auth, + this.config, ); } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index 676b7e8c3a..0e0ebd706b 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -217,6 +217,8 @@ export interface TaskStore { targetPath: string; }): Promise; + cleanWorkspace?({ taskId }: { taskId: string }): Promise; + serializeWorkspace?({ path, taskId, diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index a6b91bdccb..66e8ccd678 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -344,6 +344,8 @@ export interface TaskContext { // (undocumented) cancelSignal: AbortSignal; // (undocumented) + cleanWorkspace?(): Promise; + // (undocumented) complete(result: TaskCompletionState, metadata?: JsonObject): Promise; // (undocumented) createdBy?: string; diff --git a/plugins/scaffolder-node/src/tasks/types.ts b/plugins/scaffolder-node/src/tasks/types.ts index b2da5b2f0f..a2adb97b9c 100644 --- a/plugins/scaffolder-node/src/tasks/types.ts +++ b/plugins/scaffolder-node/src/tasks/types.ts @@ -143,6 +143,8 @@ export interface TaskContext { serializeWorkspace?(options: { path: string }): Promise; + cleanWorkspace?(): Promise; + rehydrateWorkspace?(options: { taskId: string; targetPath: string; From a5ad56226e5044f11a68d7bdb2cd7822d41f6424 Mon Sep 17 00:00:00 2001 From: Joshua Jung Date: Mon, 6 May 2024 13:59:28 +0200 Subject: [PATCH 120/136] Update feature-flags.md Some minor updates to punctuation, code examples, and language Signed-off-by: Joshua Jung --- docs/plugins/feature-flags.md | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/docs/plugins/feature-flags.md b/docs/plugins/feature-flags.md index 7b7a6c1435..3afb8081d5 100644 --- a/docs/plugins/feature-flags.md +++ b/docs/plugins/feature-flags.md @@ -6,39 +6,39 @@ description: Details the process of defining setting and reading a feature flag. Backstage offers the ability to define feature flags inside a plugin or during application creation. This allows you to restrict parts of your plugin to those individual users who have toggled the feature flag to on. -This page describes the process of defining setting and reading a feature flag. If you are looking for using feature flags with software templates that can be found under [Writing Templates](https://backstage.io/docs/features/software-templates/writing-templates#remove-sections-or-fields-based-on-feature-flags). +This page describes the process of defining, setting and reading a feature flag. If you are looking for using feature flags specifically with software templates please see [Writing Templates](https://backstage.io/docs/features/software-templates/writing-templates#remove-sections-or-fields-based-on-feature-flags). ## Defining a Feature Flag ### In a plugin -Defining feature flag in a plugin is done by passing the name of the feature flag into the `featureFlags` array: +Defining a feature flag in a plugin is done by passing the name of the feature flag into the `featureFlags` array: -```ts -/* src/plugin.ts */ -import { createPlugin, createRouteRef } from '@backstage/core-plugin-api'; -import ExampleComponent from './components/ExampleComponent'; +```ts title="src/plugin.ts" +import { createPlugin } from '@backstage/core-plugin-api'; export const examplePlugin = createPlugin({ - id: 'example', - routes: { - root: rootRouteRef, - }, + // ... featureFlags: [{ name: 'show-example-feature' }], + // ... }); ``` ### In the application -Defining feature flag in the application is done by adding feature flags in`featureFlags` array in +Defining a feature flag in the application is done by adding feature flags in `featureFlags` array in the `createApp()` function call: -```ts +```ts title="packages/app/src/App.tsx" +import { createApp } from '@backstage/app-defaults'; + const app = createApp({ // ... featureFlags: [ { - pluginId: '', // pluginId is required for feature flags in plugins. It can be left blank for a feature flag leveraged in the application. + // pluginId is required for feature flags used in plugins. + // pluginId can be left blank for a feature flag used in the application and not in plugins. + pluginId: '', name: 'tech-radar', description: 'Enables the tech radar plugin', }, @@ -49,11 +49,9 @@ const app = createApp({ ## Enabling Feature Flags -Feature flags are defaulted to off and can be updated by individual users in the backstage interface. +Feature flags are defaulted to off and can be updated by individual users in the backstage interface. These are set by navigating to the page under `Settings` > `Feature Flags`. -These are set by navigating to the page under `Settings` > `Feature Flags`. - -The users selection is saved in the users browsers local storage. Once toggled it may be required for a user to refresh the page to see any new changes. +The user's selection is saved in the user's browser local storage. Once a feature flag is toggled it may be required for a user to refresh the page to see the change. ## FeatureFlagged Component @@ -75,7 +73,7 @@ import { FeatureFlagged } from '@backstage/core-app-api'; ## Evaluating Feature Flag State -It is also possible to test the feature flag state using the [FeatureFlags Api](https://backstage.io/docs/reference/core-plugin-api.featureflagsapi). +It is also possible to query a feature flag using the [FeatureFlags Api](https://backstage.io/docs/reference/core-plugin-api.featureflagsapi). ```ts import { useApi, featureFlagsApiRef } from '@backstage/core-plugin-api'; From ddddecb21cfe9937426d8a068674866cc6650b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 6 May 2024 17:14:30 +0200 Subject: [PATCH 121/136] frontend-app-api: always shunt mentioned extensions to the top MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/lazy-phones-worry.md | 5 ++ .../src/tree/resolveAppNodeSpecs.test.ts | 76 +++++++++++++++++-- .../src/tree/resolveAppNodeSpecs.ts | 19 ++--- .../src/wiring/createPlugin.test.ts | 2 +- 4 files changed, 86 insertions(+), 16 deletions(-) create mode 100644 .changeset/lazy-phones-worry.md diff --git a/.changeset/lazy-phones-worry.md b/.changeset/lazy-phones-worry.md new file mode 100644 index 0000000000..2c64f81f2c --- /dev/null +++ b/.changeset/lazy-phones-worry.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-app-api': minor +--- + +Extensions in app-config now always affect ordering. Previously, only when enabling disabled extensions did they rise to the top. diff --git a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts index 82f274b960..8af2aef070 100644 --- a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts +++ b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts @@ -110,6 +110,12 @@ describe('resolveAppNodeSpecs', () => { ], }), ).toEqual([ + { + id: 'b', + extension: b, + attachTo: { id: 'derp', input: 'default' }, + disabled: false, + }, { id: 'test/a', extension: makeExt('test/a'), @@ -117,12 +123,6 @@ describe('resolveAppNodeSpecs', () => { source: pluginA, disabled: false, }, - { - id: 'b', - extension: b, - attachTo: { id: 'derp', input: 'default' }, - disabled: false, - }, ]); }); @@ -206,6 +206,70 @@ describe('resolveAppNodeSpecs', () => { ]); }); + it('should place config-mentioned instances in the order that they were listed, irrespective of if the extension was enabled or not originally', () => { + const a = makeExt('a', 'disabled'); + const b = makeExt('b', 'enabled'); + const c = makeExt('c', 'disabled'); + const d = makeExt('d', 'enabled'); + const e = makeExt('e', 'disabled'); + const f = makeExt('f', 'enabled'); + const g = makeExt('g', 'disabled'); + expect( + resolveAppNodeSpecs({ + features: [createPlugin({ id: 'empty', extensions: [] })], + builtinExtensions: [a, b, c, d, e, f, g], + parameters: [ + { id: 'e', disabled: false }, + { id: 'd', disabled: false }, + { id: 'c', disabled: false }, + ], + }), + ).toEqual([ + { + id: 'e', + extension: e, + attachTo: { id: 'root', input: 'default' }, + disabled: false, + }, + { + id: 'd', + extension: d, + attachTo: { id: 'root', input: 'default' }, + disabled: false, + }, + { + id: 'c', + extension: c, + attachTo: { id: 'root', input: 'default' }, + disabled: false, + }, + { + id: 'a', + extension: a, + attachTo: { id: 'root', input: 'default' }, + disabled: true, + }, + { + id: 'b', + extension: b, + attachTo: { id: 'root', input: 'default' }, + disabled: false, + }, + { + id: 'f', + extension: f, + attachTo: { id: 'root', input: 'default' }, + disabled: false, + }, + { + id: 'g', + extension: g, + attachTo: { id: 'root', input: 'default' }, + disabled: true, + }, + ]); + }); + it('should apply extension overrides', () => { const plugin = createPlugin({ id: 'test', diff --git a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts index f056e7a49e..e31c70025d 100644 --- a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts +++ b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts @@ -184,6 +184,7 @@ export function resolveAppNodeSpecs(options: { ); } + const order = new Map(); for (const overrideParam of parameters) { const extensionId = overrideParam.id; @@ -193,11 +194,10 @@ export function resolveAppNodeSpecs(options: { ); } - const existingIndex = configuredExtensions.findIndex( + const existing = configuredExtensions.find( e => e.extension.id === extensionId, ); - if (existingIndex !== -1) { - const existing = configuredExtensions[existingIndex]; + if (existing) { if (overrideParam.attachTo) { existing.params.attachTo = overrideParam.attachTo; } @@ -209,18 +209,19 @@ export function resolveAppNodeSpecs(options: { Boolean(existing.params.disabled) !== Boolean(overrideParam.disabled) ) { existing.params.disabled = Boolean(overrideParam.disabled); - if (!existing.params.disabled) { - // bump - configuredExtensions.splice(existingIndex, 1); - configuredExtensions.push(existing); - } } + order.set(extensionId, existing); } else { throw new Error(`Extension ${extensionId} does not exist`); } } - return configuredExtensions.map(param => ({ + const orderedExtensions = [ + ...order.values(), + ...configuredExtensions.filter(e => !order.has(e.extension.id)), + ]; + + return orderedExtensions.map(param => ({ id: param.extension.id, attachTo: param.params.attachTo, extension: param.extension, diff --git a/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts b/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts index c180dc9719..dab8a9778a 100644 --- a/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts +++ b/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts @@ -187,7 +187,7 @@ describe('createPlugin', () => { await expect( screen.findByText( - 'Names: extension-1, extension-2-renamed, extension-3:child', + 'Names: extension-2-renamed, extension-1, extension-3:child', ), ).resolves.toBeInTheDocument(); }); From 5e033426086a81f9ace44442b2143000bf7d3454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 6 May 2024 22:06:47 +0200 Subject: [PATCH 122/136] added two more esm-only packages to the renovate block list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .github/renovate.json5 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 1c8d611c49..5a70a25512 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -70,5 +70,13 @@ matchPackageNames: ['p-queue'], allowedVersions: '<7.0.0', }, + { + matchPackageNames: ['serialize-error'], + allowedVersions: '<9.0.0', + }, + { + matchPackageNames: ['yn'], + allowedVersions: '<5.0.0', + }, ], } From c5d7b40b4b40da3340e5327445d32bd4753bd55e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 28 Feb 2024 13:30:52 +0100 Subject: [PATCH 123/136] fix the opentelemetry setup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/sharp-glasses-live.md | 5 + docs/tutorials/setup-opentelemetry.md | 74 +- packages/backend-legacy/package.json | 3 - packages/backend-legacy/src/index.ts | 11 - packages/backend/package.json | 10 +- .../prometheus.yml | 0 packages/backend/src/instrumentation.js | 34 + packages/cli/cli-report.md | 1 + packages/cli/src/commands/index.ts | 1 + packages/cli/src/commands/start/command.ts | 1 + .../cli/src/commands/start/startBackend.ts | 6 + packages/cli/src/lib/bundler/config.ts | 3 + packages/cli/src/lib/bundler/types.ts | 2 + .../experimental/startBackendExperimental.ts | 3 + yarn.lock | 1621 ++++++++++++++++- 15 files changed, 1687 insertions(+), 88 deletions(-) create mode 100644 .changeset/sharp-glasses-live.md rename packages/{backend-legacy => backend}/prometheus.yml (100%) create mode 100644 packages/backend/src/instrumentation.js diff --git a/.changeset/sharp-glasses-live.md b/.changeset/sharp-glasses-live.md new file mode 100644 index 0000000000..000f49fc47 --- /dev/null +++ b/.changeset/sharp-glasses-live.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Allow passing a `--require` argument through to the Node process during `package start` diff --git a/docs/tutorials/setup-opentelemetry.md b/docs/tutorials/setup-opentelemetry.md index 976ba4ccfb..c49eef26a2 100644 --- a/docs/tutorials/setup-opentelemetry.md +++ b/docs/tutorials/setup-opentelemetry.md @@ -6,42 +6,37 @@ description: Tutorial to setup OpenTelemetry metrics and traces exporters in Bac Backstage uses [OpenTelemetery](https://opentelemetry.io/) to instrument its components by reporting traces and metrics. -This tutorial shows how to setup exporters in your Backstage backend package. For demonstration purposes we will use the simple console exporters. +This tutorial shows how to setup exporters in your Backstage backend package. For demonstration purposes we will use a Prometheus exporter, but you can adjust your solution to use another one that suits your needs; see for example the article on [OTLP exporters](https://opentelemetry.io/docs/instrumentation/js/exporters/). ## Install dependencies We will use the OpenTelemetry Node SDK and the `auto-instrumentations-node` packages. -Backstage packages, such as the catalog, uses the OpenTelemetry API to send custom traces and metrics. +Backstage packages, such as the catalog, use the OpenTelemetry API to send custom traces and metrics. The `auto-instrumentations-node` will automatically create spans for code called in libraries like Express. ```bash -yarn --cwd packages/backend add @opentelemetry/sdk-node \ +yarn --cwd packages/backend add \ + @opentelemetry/sdk-node \ @opentelemetry/auto-instrumentations-node \ - @opentelemetry/sdk-metrics \ - @opentelemetry/sdk-trace-node + @opentelemetry/exporter-prometheus ``` ## Configure -In your `packages/backend` folder, create an `instrumentation.js` file. +In your `packages/backend/src` folder, create an `instrumentation.js` file. -```typescript +```typescript title="in packages/backend/src/instrumentation.js" const { NodeSDK } = require('@opentelemetry/sdk-node'); -const { ConsoleSpanExporter } = require('@opentelemetry/sdk-trace-node'); const { getNodeAutoInstrumentations, } = require('@opentelemetry/auto-instrumentations-node'); -const { - PeriodicExportingMetricReader, - ConsoleMetricExporter, -} = require('@opentelemetry/sdk-metrics'); +const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus'); +const prometheus = new PrometheusExporter(); const sdk = new NodeSDK({ - traceExporter: new ConsoleSpanExporter(), - metricReader: new PeriodicExportingMetricReader({ - exporter: new ConsoleMetricExporter(), - }), + // You can add a traceExporter field here too + metricReader: prometheus, instrumentations: [getNodeAutoInstrumentations()], }); @@ -51,42 +46,33 @@ sdk.start(); You probably won't need all of the instrumentation inside `getNodeAutoInstrumentations()` so make sure to check the [documentation](https://www.npmjs.com/package/@opentelemetry/auto-instrumentations-node) and tweak it properly. -It's important to setup the NodeSDK and the automatic instrumentation **before** importing any library. +## Local Development Setup -This is why we will use the nodejs [`--require`](https://nodejs.org/api/cli.html#-r---require-module) -flag when we start up the application. +It's important to setup the NodeSDK and the automatic instrumentation **before** +importing any library. This is why we will use the nodejs +[`--require`](https://nodejs.org/api/cli.html#-r---require-module) flag when we +start up the application. -In your `Dockerfile` add the `--require` flag which points to the `instrumentation.js` file +For local development, you can add the required flag in your `packages/backend/package.json`. -```Dockerfile - -# We need the instrumentation file inside the Docker image so we can use it with --require -// highlight-add-next-line -COPY --chown=node:node packages/backend/instrumentation.js ./ - -// highlight-remove-next-line -CMD ["node", "packages/backend", "--config", "app-config.yaml"] -// highlight-add-next-line -CMD ["node", "--require", "./instrumentation.js", "packages/backend", "--config", "app-config.yaml"] -``` - -## Run Backstage - -The above configuration will only work in production once your start a Docker container from the image. - -To be able to test locally you can import the `./instrumentation.js` file at the top (before all imports) of your backend `index.ts` file - -```ts -import '../instrumentation.js' -// Other imports -... +```json title="packages/backend/package.json" +"scripts": { + "start": "backstage-cli package start --require ./src/instrumentation.js", + ... ``` You can now start your Backstage instance as usual, using `yarn dev`. -When the backend is started, you should see in your console traces and metrics emitted by OpenTelemetry. +## Production Setup -Of course in production you probably won't use the console exporters but instead send traces and metrics to an OpenTelemetry Collector or other exporter using [OTLP exporters](https://opentelemetry.io/docs/instrumentation/js/exporters/). +In your `Dockerfile` add the `--require` flag which points to the `instrumentation.js` file + +```Dockerfile +// highlight-remove-next-line +CMD ["node", "packages/backend", "--config", "app-config.yaml"] +// highlight-add-next-line +CMD ["node", "--require", "./src/instrumentation.js", "packages/backend", "--config", "app-config.yaml"] +``` If you need to disable/configure some OpenTelemetry feature there are lots of [environment variables](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/) which you can tweak. diff --git a/packages/backend-legacy/package.json b/packages/backend-legacy/package.json index 97178dcb2c..47c04f9a3c 100644 --- a/packages/backend-legacy/package.json +++ b/packages/backend-legacy/package.json @@ -65,9 +65,6 @@ "@backstage/plugin-techdocs-backend": "workspace:^", "@gitbeaker/node": "^35.1.0", "@octokit/rest": "^19.0.3", - "@opentelemetry/api": "^1.4.1", - "@opentelemetry/exporter-prometheus": "^0.50.0", - "@opentelemetry/sdk-metrics": "^1.13.0", "azure-devops-node-api": "^12.0.0", "better-sqlite3": "^9.0.0", "dockerode": "^4.0.0", diff --git a/packages/backend-legacy/src/index.ts b/packages/backend-legacy/src/index.ts index 34ea8b0f6c..33520cba03 100644 --- a/packages/backend-legacy/src/index.ts +++ b/packages/backend-legacy/src/index.ts @@ -56,19 +56,8 @@ import { ServerPermissionClient } from '@backstage/plugin-permission-node'; import { DefaultIdentityClient } from '@backstage/plugin-auth-node'; import { DefaultEventBroker } from '@backstage/plugin-events-backend'; import { DefaultEventsService } from '@backstage/plugin-events-node'; -import { PrometheusExporter } from '@opentelemetry/exporter-prometheus'; -import { MeterProvider } from '@opentelemetry/sdk-metrics'; -import { metrics } from '@opentelemetry/api'; import { DefaultSignalsService } from '@backstage/plugin-signals-node'; -// Expose opentelemetry metrics using a Prometheus exporter on -// http://localhost:9464/metrics . See prometheus.yml in packages/backend for -// more information on how to scrape it. -const exporter = new PrometheusExporter(); -const meterProvider = new MeterProvider(); -metrics.setGlobalMeterProvider(meterProvider); -meterProvider.addMetricReader(exporter); - function makeCreateEnv(config: Config) { const root = getRootLogger(); const reader = UrlReaders.default({ logger: root, config }); diff --git a/packages/backend/package.json b/packages/backend/package.json index c76a3be0a3..8d59d52ea8 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -21,9 +21,10 @@ "build": "backstage-cli package build", "clean": "backstage-cli package clean", "lint": "backstage-cli package lint", - "start": "backstage-cli package start", + "start": "backstage-cli package start --require ./src/instrumentation.js", "test": "backstage-cli package test", - "build-image": "docker build ../.. -f Dockerfile --tag example-backend" + "build-image": "docker build ../.. -f Dockerfile --tag example-backend", + "start:prometheus": "docker run --mount type=bind,source=./prometheus.yml,destination=/etc/prometheus/prometheus.yml --publish published=9090,target=9090,protocol=tcp prom/prometheus" }, "dependencies": { "@backstage/backend-defaults": "workspace:^", @@ -56,7 +57,10 @@ "@backstage/plugin-search-backend-module-techdocs": "workspace:^", "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-signals-backend": "workspace:^", - "@backstage/plugin-techdocs-backend": "workspace:^" + "@backstage/plugin-techdocs-backend": "workspace:^", + "@opentelemetry/auto-instrumentations-node": "^0.43.0", + "@opentelemetry/exporter-prometheus": "^0.50.0", + "@opentelemetry/sdk-node": "^0.50.0" }, "devDependencies": { "@backstage/cli": "workspace:^" diff --git a/packages/backend-legacy/prometheus.yml b/packages/backend/prometheus.yml similarity index 100% rename from packages/backend-legacy/prometheus.yml rename to packages/backend/prometheus.yml diff --git a/packages/backend/src/instrumentation.js b/packages/backend/src/instrumentation.js new file mode 100644 index 0000000000..e3725632c1 --- /dev/null +++ b/packages/backend/src/instrumentation.js @@ -0,0 +1,34 @@ +/* + * Copyright 2024 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. + */ + +const { NodeSDK } = require('@opentelemetry/sdk-node'); +const { + getNodeAutoInstrumentations, +} = require('@opentelemetry/auto-instrumentations-node'); +const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus'); + +// Expose opentelemetry metrics using a Prometheus exporter on +// http://localhost:9464/metrics. See packages/backend/prometheus.yml for +// more information on how to scrape it. +const prometheus = new PrometheusExporter(); + +const sdk = new NodeSDK({ + // traceExporter: ..., + metricReader: prometheus, + instrumentations: [getNodeAutoInstrumentations()], +}); + +sdk.start(); diff --git a/packages/cli/cli-report.md b/packages/cli/cli-report.md index 819b1a2261..7b6df4366c 100644 --- a/packages/cli/cli-report.md +++ b/packages/cli/cli-report.md @@ -280,6 +280,7 @@ Options: --check --inspect [host] --inspect-brk [host] + --require -h, --help ``` diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index fe23926148..3554ddfbef 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -120,6 +120,7 @@ export function registerScriptCommand(program: Command) { '--inspect-brk [host]', 'Enable debugger in Node.js environments, breaking before code starts', ) + .option('--require ', 'Add a --require argument to the node process') .action(lazy(() => import('./start').then(m => m.command))); command diff --git a/packages/cli/src/commands/start/command.ts b/packages/cli/src/commands/start/command.ts index 427f8b6efb..2f2af95d85 100644 --- a/packages/cli/src/commands/start/command.ts +++ b/packages/cli/src/commands/start/command.ts @@ -27,6 +27,7 @@ export async function command(opts: OptionValues): Promise { checksEnabled: Boolean(opts.check), inspectEnabled: opts.inspect, inspectBrkEnabled: opts.inspectBrk, + require: opts.require, }; switch (role) { diff --git a/packages/cli/src/commands/start/startBackend.ts b/packages/cli/src/commands/start/startBackend.ts index 25758a0939..778a31e7e7 100644 --- a/packages/cli/src/commands/start/startBackend.ts +++ b/packages/cli/src/commands/start/startBackend.ts @@ -23,6 +23,7 @@ interface StartBackendOptions { checksEnabled: boolean; inspectEnabled: boolean; inspectBrkEnabled: boolean; + require?: string; } export async function startBackend(options: StartBackendOptions) { @@ -32,6 +33,7 @@ export async function startBackend(options: StartBackendOptions) { checksEnabled: false, // not supported inspectEnabled: options.inspectEnabled, inspectBrkEnabled: options.inspectBrkEnabled, + require: options.require, }); await waitForExit(); @@ -41,6 +43,7 @@ export async function startBackend(options: StartBackendOptions) { checksEnabled: options.checksEnabled, inspectEnabled: options.inspectEnabled, inspectBrkEnabled: options.inspectBrkEnabled, + require: options.require, }); await waitForExit(); @@ -70,6 +73,7 @@ export async function startBackendPlugin(options: StartBackendOptions) { checksEnabled: false, // not supported inspectEnabled: options.inspectEnabled, inspectBrkEnabled: options.inspectBrkEnabled, + require: options.require, }); await waitForExit(); @@ -87,6 +91,7 @@ export async function startBackendPlugin(options: StartBackendOptions) { checksEnabled: options.checksEnabled, inspectEnabled: options.inspectEnabled, inspectBrkEnabled: options.inspectBrkEnabled, + require: options.require, }); await waitForExit(); @@ -98,6 +103,7 @@ async function cleanDistAndServeBackend(options: { checksEnabled: boolean; inspectEnabled: boolean; inspectBrkEnabled: boolean; + require?: string; }) { // Cleaning dist/ before we start the dev process helps work around an issue // where we end up with the entrypoint executing multiple times, causing diff --git a/packages/cli/src/lib/bundler/config.ts b/packages/cli/src/lib/bundler/config.ts index dc90bed1e7..53db7f3597 100644 --- a/packages/cli/src/lib/bundler/config.ts +++ b/packages/cli/src/lib/bundler/config.ts @@ -276,6 +276,9 @@ export async function createBackendConfig( : '--inspect-brk'; runScriptNodeArgs.push(inspect); } + if (options.require) { + runScriptNodeArgs.push(`--require=${options.require}`); + } return { mode: isDev ? 'development' : 'production', diff --git a/packages/cli/src/lib/bundler/types.ts b/packages/cli/src/lib/bundler/types.ts index 8fe25e91c5..85a641465f 100644 --- a/packages/cli/src/lib/bundler/types.ts +++ b/packages/cli/src/lib/bundler/types.ts @@ -54,10 +54,12 @@ export type BackendBundlingOptions = { parallelism?: number; inspectEnabled: boolean; inspectBrkEnabled: boolean; + require?: string; }; export type BackendServeOptions = BundlingPathsOptions & { checksEnabled: boolean; inspectEnabled: boolean; inspectBrkEnabled: boolean; + require?: string; }; diff --git a/packages/cli/src/lib/experimental/startBackendExperimental.ts b/packages/cli/src/lib/experimental/startBackendExperimental.ts index 19f71aa993..bd4bb94b17 100644 --- a/packages/cli/src/lib/experimental/startBackendExperimental.ts +++ b/packages/cli/src/lib/experimental/startBackendExperimental.ts @@ -96,6 +96,9 @@ export async function startBackendExperimental(options: BackendServeOptions) { : '--inspect-brk'; optionArgs.push(inspect); } + if (options.require) { + optionArgs.push(`--require=${options.require}`); + } const userArgs = process.argv .slice(['node', 'backstage-cli', 'package', 'start'].length) diff --git a/yarn.lock b/yarn.lock index 89d4b0ee45..14d064088b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9362,6 +9362,16 @@ __metadata: languageName: node linkType: hard +"@grpc/grpc-js@npm:^1.7.1": + version: 1.10.7 + resolution: "@grpc/grpc-js@npm:1.10.7" + dependencies: + "@grpc/proto-loader": ^0.7.13 + "@js-sdsl/ordered-map": ^4.4.2 + checksum: 69e88768e59b53ca020e2cfa9474fbd645f4ee7dd3269559c9fb91970273da6e8db480c0c439bdd73b49f1831d8f47c9bc5305dc5f9ed4db8873d53572e4f019 + languageName: node + linkType: hard + "@grpc/grpc-js@npm:~1.9.6": version: 1.9.11 resolution: "@grpc/grpc-js@npm:1.9.11" @@ -9372,17 +9382,108 @@ __metadata: languageName: node linkType: hard -"@grpc/proto-loader@npm:^0.7.0, @grpc/proto-loader@npm:^0.7.8": - version: 0.7.10 - resolution: "@grpc/proto-loader@npm:0.7.10" +"@grpc/proto-loader@npm:^0.7.0, @grpc/proto-loader@npm:^0.7.13, @grpc/proto-loader@npm:^0.7.8": + version: 0.7.13 + resolution: "@grpc/proto-loader@npm:0.7.13" dependencies: lodash.camelcase: ^4.3.0 long: ^5.0.0 - protobufjs: ^7.2.4 + protobufjs: ^7.2.5 yargs: ^17.7.2 bin: proto-loader-gen-types: build/bin/proto-loader-gen-types.js - checksum: 4987e23b57942c2363b6a6a106e63efae636666cefa348778dfafef2ff72da7343c8587667521cb1d52482827bcd001dd535bdc27065110af56d9c7c176334c9 + checksum: 399c1b8a4627f93dc31660d9636ea6bf58be5675cc7581e3df56a249369e5be02c6cd0d642c5332b0d5673bc8621619bc06fb045aa3e8f57383737b5d35930dc + languageName: node + linkType: hard + +"@hapi/b64@npm:5.x.x": + version: 5.0.0 + resolution: "@hapi/b64@npm:5.0.0" + dependencies: + "@hapi/hoek": 9.x.x + checksum: 1e166bc9a6ca2952190ede40089d552efa21554c3325d5174e5616b940f79cd8327520b239ef6725f823f95b9e4684579bc8e99a222b28639b793ae0ef788409 + languageName: node + linkType: hard + +"@hapi/boom@npm:9.x.x, @hapi/boom@npm:^9.0.0": + version: 9.1.4 + resolution: "@hapi/boom@npm:9.1.4" + dependencies: + "@hapi/hoek": 9.x.x + checksum: b1cdde1e82fae8222d893ac74e13e9a784f0398ffcb7ece32f6eb69bad990ca62f3c40cca19673e74cc676628ff121ee5576d6b0f1add92dcfa182ff9b90b937 + languageName: node + linkType: hard + +"@hapi/bourne@npm:2.x.x": + version: 2.1.0 + resolution: "@hapi/bourne@npm:2.1.0" + checksum: 0ce5a38bc46b1b649fc04c00763def978c99b2eba5013e512f492f4d0d806a6fc1d09f36524c2f8b45cc778d481a06c1f808392e08bc6ebd14abab4bfde07ca5 + languageName: node + linkType: hard + +"@hapi/cryptiles@npm:5.x.x": + version: 5.1.0 + resolution: "@hapi/cryptiles@npm:5.1.0" + dependencies: + "@hapi/boom": 9.x.x + checksum: 3109ad8435d6333b22092e8264e0cc32baafaa10c8c813685ca379c033b5d4123cd503aecdb535fb0c2d39d8e26c494f4c4998d5d040865907b64bf4cb72c705 + languageName: node + linkType: hard + +"@hapi/hoek@npm:9.x.x, @hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": + version: 9.3.0 + resolution: "@hapi/hoek@npm:9.3.0" + checksum: 4771c7a776242c3c022b168046af4e324d116a9d2e1d60631ee64f474c6e38d1bb07092d898bf95c7bc5d334c5582798a1456321b2e53ca817d4e7c88bc25b43 + languageName: node + linkType: hard + +"@hapi/iron@npm:^6.0.0": + version: 6.0.0 + resolution: "@hapi/iron@npm:6.0.0" + dependencies: + "@hapi/b64": 5.x.x + "@hapi/boom": 9.x.x + "@hapi/bourne": 2.x.x + "@hapi/cryptiles": 5.x.x + "@hapi/hoek": 9.x.x + checksum: ef07abc8a55eb8b60ab0c09d797bb13b39d283260ecdabedc1568c64c47d8c15fe517beed4f76a2b69dac57e6c26cd30ac7612169c41adb8f4c77ea3f58d973d + languageName: node + linkType: hard + +"@hapi/podium@npm:^4.1.3": + version: 4.1.3 + resolution: "@hapi/podium@npm:4.1.3" + dependencies: + "@hapi/hoek": 9.x.x + "@hapi/teamwork": 5.x.x + "@hapi/validate": 1.x.x + checksum: da7d02af93a2797fc522cca0ec6cf12691a75047857db80162405d7f83bbf437d49f95c20714bd8e19f2ff41b8e5139e88fb7a896f5d967e0d9bcbf632a9feae + languageName: node + linkType: hard + +"@hapi/teamwork@npm:5.x.x": + version: 5.1.1 + resolution: "@hapi/teamwork@npm:5.1.1" + checksum: f679aff66b432f5fe3daa72a0659c4280de8f6e109e0c547ed24e7ea60149b182c406c4c02426a8bcfd87a79889b180f6d5f5a95690489e5607cc044c3c2defb + languageName: node + linkType: hard + +"@hapi/topo@npm:^5.0.0, @hapi/topo@npm:^5.1.0": + version: 5.1.0 + resolution: "@hapi/topo@npm:5.1.0" + dependencies: + "@hapi/hoek": ^9.0.0 + checksum: 604dfd5dde76d5c334bd03f9001fce69c7ce529883acf92da96f4fe7e51221bf5e5110e964caca287a6a616ba027c071748ab636ff178ad750547fba611d6014 + languageName: node + linkType: hard + +"@hapi/validate@npm:1.x.x": + version: 1.1.3 + resolution: "@hapi/validate@npm:1.1.3" + dependencies: + "@hapi/hoek": ^9.0.0 + "@hapi/topo": ^5.0.0 + checksum: dd6f8d6e33ac55d430448bc83c33572a593702ae856186610161a9488a611110ac4f793339043ea44a6f79bebe689bc7f86122df2f817725255159a0c1cb62ec languageName: node linkType: hard @@ -9931,6 +10032,13 @@ __metadata: languageName: node linkType: hard +"@js-sdsl/ordered-map@npm:^4.4.2": + version: 4.4.2 + resolution: "@js-sdsl/ordered-map@npm:4.4.2" + checksum: a927ae4ff8565ecb75355cc6886a4f8fadbf2af1268143c96c0cce3ba01261d241c3f4ba77f21f3f017a00f91dfe9e0673e95f830255945c80a0e96c6d30508a + languageName: node + linkType: hard + "@jsdevtools/ono@npm:7.1.3, @jsdevtools/ono@npm:^7.1.3": version: 7.1.3 resolution: "@jsdevtools/ono@npm:7.1.3" @@ -11908,13 +12016,114 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api@npm:^1.0.1, @opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.4.0, @opentelemetry/api@npm:^1.4.1": +"@opentelemetry/api-logs@npm:0.49.1, @opentelemetry/api-logs@npm:^0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/api-logs@npm:0.49.1" + dependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 83f559164fb62ed4343e650afccae766bb7ec730540a14f391d6ab4516a96a11cb1f9db9fc77495d07cb95541b4e8ccd184a6f36a0e38ddaad4fdd6359b3a3d9 + languageName: node + linkType: hard + +"@opentelemetry/api-logs@npm:0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/api-logs@npm:0.50.0" + dependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 5d4d9d448d1dc3a74879a19d5d24b9aecfd180e05acc622e25e5ca1bd0ad2c27b5541e101e474f2870e6470e148a7bad3c1b041d5a41181ebcde1f38a1ee6feb + languageName: node + linkType: hard + +"@opentelemetry/api@npm:^1.0.0, @opentelemetry/api@npm:^1.0.1, @opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.4.0": version: 1.8.0 resolution: "@opentelemetry/api@npm:1.8.0" checksum: 0e32079975f05bee6de2ad8ade097f0afdc63f462c76550150fce2444c73ab92aaf851ac85e638b6e3b269da6640ac7e63f33913a0fd7df9f9beec2e100759df languageName: node linkType: hard +"@opentelemetry/auto-instrumentations-node@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/auto-instrumentations-node@npm:0.43.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/instrumentation-amqplib": ^0.35.0 + "@opentelemetry/instrumentation-aws-lambda": ^0.39.0 + "@opentelemetry/instrumentation-aws-sdk": ^0.39.1 + "@opentelemetry/instrumentation-bunyan": ^0.36.0 + "@opentelemetry/instrumentation-cassandra-driver": ^0.36.0 + "@opentelemetry/instrumentation-connect": ^0.34.0 + "@opentelemetry/instrumentation-cucumber": ^0.4.0 + "@opentelemetry/instrumentation-dataloader": ^0.7.0 + "@opentelemetry/instrumentation-dns": ^0.34.0 + "@opentelemetry/instrumentation-express": ^0.36.1 + "@opentelemetry/instrumentation-fastify": ^0.34.0 + "@opentelemetry/instrumentation-fs": ^0.10.0 + "@opentelemetry/instrumentation-generic-pool": ^0.34.0 + "@opentelemetry/instrumentation-graphql": ^0.38.1 + "@opentelemetry/instrumentation-grpc": ^0.49.1 + "@opentelemetry/instrumentation-hapi": ^0.35.0 + "@opentelemetry/instrumentation-http": ^0.49.1 + "@opentelemetry/instrumentation-ioredis": ^0.38.0 + "@opentelemetry/instrumentation-knex": ^0.34.0 + "@opentelemetry/instrumentation-koa": ^0.38.0 + "@opentelemetry/instrumentation-lru-memoizer": ^0.35.0 + "@opentelemetry/instrumentation-memcached": ^0.34.0 + "@opentelemetry/instrumentation-mongodb": ^0.41.0 + "@opentelemetry/instrumentation-mongoose": ^0.36.0 + "@opentelemetry/instrumentation-mysql": ^0.36.0 + "@opentelemetry/instrumentation-mysql2": ^0.36.0 + "@opentelemetry/instrumentation-nestjs-core": ^0.35.0 + "@opentelemetry/instrumentation-net": ^0.34.0 + "@opentelemetry/instrumentation-pg": ^0.39.1 + "@opentelemetry/instrumentation-pino": ^0.36.0 + "@opentelemetry/instrumentation-redis": ^0.37.0 + "@opentelemetry/instrumentation-redis-4": ^0.37.0 + "@opentelemetry/instrumentation-restify": ^0.36.0 + "@opentelemetry/instrumentation-router": ^0.35.0 + "@opentelemetry/instrumentation-socket.io": ^0.37.0 + "@opentelemetry/instrumentation-tedious": ^0.8.0 + "@opentelemetry/instrumentation-winston": ^0.35.0 + "@opentelemetry/resource-detector-alibaba-cloud": ^0.28.7 + "@opentelemetry/resource-detector-aws": ^1.4.0 + "@opentelemetry/resource-detector-container": ^0.3.7 + "@opentelemetry/resource-detector-gcp": ^0.29.7 + "@opentelemetry/resources": ^1.12.0 + "@opentelemetry/sdk-node": ^0.49.1 + peerDependencies: + "@opentelemetry/api": ^1.4.1 + checksum: e1bb1119a58f70186cffc8de192f1b3884ba10aa31976b513a7df0995a737383fd043c570142f6feb660db087e160c24356aa55d8fe22010394efca3ca9ceb0b + languageName: node + linkType: hard + +"@opentelemetry/context-async-hooks@npm:1.22.0": + version: 1.22.0 + resolution: "@opentelemetry/context-async-hooks@npm:1.22.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 03b3b8c3eb34b35495abd9869303e67a61fafb8a004a9bc6ab1234a35909ee89d0f515cfeb5b710c9f3e8f4d185b776ada3fa2975a62d607c80986a7c46f4d83 + languageName: node + linkType: hard + +"@opentelemetry/context-async-hooks@npm:1.23.0": + version: 1.23.0 + resolution: "@opentelemetry/context-async-hooks@npm:1.23.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 4dc6c4f816402fe3deb5d43aebd4ceadd8afa8feab2047eed7cc906379fd341686cac8d16bce1c436d15e03b29883bcf73f04d4da005abe318e0b9ec69bdbd23 + languageName: node + linkType: hard + +"@opentelemetry/core@npm:1.22.0": + version: 1.22.0 + resolution: "@opentelemetry/core@npm:1.22.0" + dependencies: + "@opentelemetry/semantic-conventions": 1.22.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 0056bbaceb922816ec87e7e21aa8a7687377a41ba36a598bb6c49738d1eb5767f823e5758b5bf844d2b10aa075c553e98904dd6fd4f02c24cf335e3951fe78a6 + languageName: node + linkType: hard + "@opentelemetry/core@npm:1.23.0": version: 1.23.0 resolution: "@opentelemetry/core@npm:1.23.0" @@ -11926,6 +12135,17 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/core@npm:1.24.0, @opentelemetry/core@npm:^1.0.0, @opentelemetry/core@npm:^1.1.0, @opentelemetry/core@npm:^1.8.0": + version: 1.24.0 + resolution: "@opentelemetry/core@npm:1.24.0" + dependencies: + "@opentelemetry/semantic-conventions": 1.24.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: b1af2641cd3af62fae772c97701434e45fbb2bbd53403aa640a589548f852759279598134b4338ed48bcde6099e273b2f34686cbf1e817d566282e3b846397b7 + languageName: node + linkType: hard + "@opentelemetry/exporter-prometheus@npm:^0.50.0": version: 0.50.0 resolution: "@opentelemetry/exporter-prometheus@npm:0.50.0" @@ -11939,6 +12159,875 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/exporter-trace-otlp-grpc@npm:0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.49.1" + dependencies: + "@grpc/grpc-js": ^1.7.1 + "@opentelemetry/core": 1.22.0 + "@opentelemetry/otlp-grpc-exporter-base": 0.49.1 + "@opentelemetry/otlp-transformer": 0.49.1 + "@opentelemetry/resources": 1.22.0 + "@opentelemetry/sdk-trace-base": 1.22.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 2418f68c8027d5baf5609f7e32b524826ecdc16b3382f6113a6f1f00835e59275a51f2fdefcd5b6f73f455aab444892097866ce8e894d0415d70acd25a6a3049 + languageName: node + linkType: hard + +"@opentelemetry/exporter-trace-otlp-grpc@npm:0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.50.0" + dependencies: + "@grpc/grpc-js": ^1.7.1 + "@opentelemetry/core": 1.23.0 + "@opentelemetry/otlp-grpc-exporter-base": 0.50.0 + "@opentelemetry/otlp-transformer": 0.50.0 + "@opentelemetry/resources": 1.23.0 + "@opentelemetry/sdk-trace-base": 1.23.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: f27189ebf0ae4f417d7e3697a5679805da3544cc60082b89d2d66344a3a4e1941f2f9ab130954ea2718ed32f14201d5679b675d1eb026b7ed5f7b9f817243e57 + languageName: node + linkType: hard + +"@opentelemetry/exporter-trace-otlp-http@npm:0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.49.1" + dependencies: + "@opentelemetry/core": 1.22.0 + "@opentelemetry/otlp-exporter-base": 0.49.1 + "@opentelemetry/otlp-transformer": 0.49.1 + "@opentelemetry/resources": 1.22.0 + "@opentelemetry/sdk-trace-base": 1.22.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 35084da407169f7871c016f92df787446f7e133b8cf6a062b9e76e4779373dae7f054b98ace7709bd52b236f13a073b58fa599bf8fc09d5a9df09945bac0fa49 + languageName: node + linkType: hard + +"@opentelemetry/exporter-trace-otlp-http@npm:0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.50.0" + dependencies: + "@opentelemetry/core": 1.23.0 + "@opentelemetry/otlp-exporter-base": 0.50.0 + "@opentelemetry/otlp-transformer": 0.50.0 + "@opentelemetry/resources": 1.23.0 + "@opentelemetry/sdk-trace-base": 1.23.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: e0725be8f19f2c37c9b16989ff234183213878dad44f0698fc2b6a815c5979498c3766b0377932197ef051a0914d337c81a486612eac2285a4c9cb8313eefa6b + languageName: node + linkType: hard + +"@opentelemetry/exporter-trace-otlp-proto@npm:0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.49.1" + dependencies: + "@opentelemetry/core": 1.22.0 + "@opentelemetry/otlp-exporter-base": 0.49.1 + "@opentelemetry/otlp-proto-exporter-base": 0.49.1 + "@opentelemetry/otlp-transformer": 0.49.1 + "@opentelemetry/resources": 1.22.0 + "@opentelemetry/sdk-trace-base": 1.22.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 0afa21d176f087d52b68b84f5645076241e5b842461add7de4429f8860861d5141d5f84be144b74d7656d3928bc580f8ee12bb231b4d80861f73128f3b09b4fc + languageName: node + linkType: hard + +"@opentelemetry/exporter-trace-otlp-proto@npm:0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.50.0" + dependencies: + "@opentelemetry/core": 1.23.0 + "@opentelemetry/otlp-exporter-base": 0.50.0 + "@opentelemetry/otlp-proto-exporter-base": 0.50.0 + "@opentelemetry/otlp-transformer": 0.50.0 + "@opentelemetry/resources": 1.23.0 + "@opentelemetry/sdk-trace-base": 1.23.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 9666686d85a0966373e5b01e55f6ae9bbe397a27efce4f2bd1eb861e993f5894724b5b5131c4a74061f6bb60b18ba946f27e38850fcd33204ca99f631317139e + languageName: node + linkType: hard + +"@opentelemetry/exporter-zipkin@npm:1.22.0": + version: 1.22.0 + resolution: "@opentelemetry/exporter-zipkin@npm:1.22.0" + dependencies: + "@opentelemetry/core": 1.22.0 + "@opentelemetry/resources": 1.22.0 + "@opentelemetry/sdk-trace-base": 1.22.0 + "@opentelemetry/semantic-conventions": 1.22.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 8d3d396d3cf69d5b507abb980a1d548c6a93243d5413c371a8ed7a025990e02c04498f7232c2562279d74a1c4ec862292d6a3498a4513eebe9882d615226c5fd + languageName: node + linkType: hard + +"@opentelemetry/exporter-zipkin@npm:1.23.0": + version: 1.23.0 + resolution: "@opentelemetry/exporter-zipkin@npm:1.23.0" + dependencies: + "@opentelemetry/core": 1.23.0 + "@opentelemetry/resources": 1.23.0 + "@opentelemetry/sdk-trace-base": 1.23.0 + "@opentelemetry/semantic-conventions": 1.23.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 08d5f7a9e2af1ad749be8cb6e65d1b312d1e86dd9ec484156ddcd2c0ad3ff27dded459c599ec406d9bccb937e1fd5b58e9af6ff2e5efc3d2e4e83ca2af12920e + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-amqplib@npm:^0.35.0": + version: 0.35.0 + resolution: "@opentelemetry/instrumentation-amqplib@npm:0.35.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 7f99738f85d56ee0b706330558936c92e2f2b6f91ae86896b3ac0891f40a42c5b8cee8b457a8efc12d4875ed73b29f36d9aa3590b779a1214d13a655b83268ce + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-aws-lambda@npm:^0.39.0": + version: 0.39.0 + resolution: "@opentelemetry/instrumentation-aws-lambda@npm:0.39.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/propagator-aws-xray": ^1.3.1 + "@opentelemetry/resources": ^1.8.0 + "@opentelemetry/semantic-conventions": ^1.0.0 + "@types/aws-lambda": 8.10.122 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: e2840a79680e70157f82341f7796e3d53e79c65c63bfc77995760a647e797fee4afb5dcf6220a672cf8dd3d2caa74ac15f1850a295b483d50d19dd0aeb7512d1 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-aws-sdk@npm:^0.39.1": + version: 0.39.1 + resolution: "@opentelemetry/instrumentation-aws-sdk@npm:0.39.1" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/propagation-utils": ^0.30.7 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 7d18489b2f161b9bbc2e2d25c23f7358dc5b4e623b76edfdac9f999c083b3b5dd49326b79f6dc1b19c74b9024683e12e1addf03d0817946b2f11481808bbf530 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-bunyan@npm:^0.36.0": + version: 0.36.0 + resolution: "@opentelemetry/instrumentation-bunyan@npm:0.36.0" + dependencies: + "@opentelemetry/api-logs": ^0.49.1 + "@opentelemetry/instrumentation": ^0.49.1 + "@types/bunyan": 1.8.9 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 4848164223c152381d435127a39d296da6445591a99c7d872c220e9605e1ff769537d3840f8d3b17bb4db8d8ccfec54c505e75a82f19117addef793ba990d74d + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-cassandra-driver@npm:^0.36.0": + version: 0.36.0 + resolution: "@opentelemetry/instrumentation-cassandra-driver@npm:0.36.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: f978269c922b1a1880ad792accfe359073c0e2ba6060ea75060c9785115aab0b6ce39cfe861a4f358e3da90ad2a7d9f53d52cbf54ac94fd65602bfd732709a32 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-connect@npm:^0.34.0": + version: 0.34.0 + resolution: "@opentelemetry/instrumentation-connect@npm:0.34.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + "@types/connect": 3.4.36 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: dde9880cd00490bfc52dca8b3b1be6a4951e859fa98617e6db78ec95ce84e8d3df3bbbbe5711796a13bd672aa2d89ba4439621a70614f8b1400943cc439540ad + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-cucumber@npm:^0.4.0": + version: 0.4.0 + resolution: "@opentelemetry/instrumentation-cucumber@npm:0.4.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 4126c5eaf5d48daca410b0ce76bd4d97f6e868fe0b0c151f88f379a93a1d95a1b7e934cb876d0060182f1b9dd20012aac13fc9c7baa6dd4f0c7f903fdfdce54e + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-dataloader@npm:^0.7.0": + version: 0.7.0 + resolution: "@opentelemetry/instrumentation-dataloader@npm:0.7.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: bbd5f27ff770ccb7d79bf16c81c5de9ad84e0c27df8991f8fd36560f190bbb7b7b7d9c8c62d438577f18033447795519a16f66e650f8e009031ffc52a96be825 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-dns@npm:^0.34.0": + version: 0.34.0 + resolution: "@opentelemetry/instrumentation-dns@npm:0.34.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + semver: ^7.5.4 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 9c2b4aae823255d88590c39802a76df888b745f744442930e322e9f48558090a9e08f91c7cd7433d48fac97dc7747ed636446277f3f163dcaecc0c70c53d0604 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-express@npm:^0.36.1": + version: 0.36.1 + resolution: "@opentelemetry/instrumentation-express@npm:0.36.1" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: c4f4ed644a194160dd816e20cd914ab59b7927c11b2c1639fb17bb160a59148a027b23c3259d3ec3ac3384b90c769b15bedd7aac4649ac3ae01ee2cdb746f61d + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-fastify@npm:^0.34.0": + version: 0.34.0 + resolution: "@opentelemetry/instrumentation-fastify@npm:0.34.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: c37d8f889b1b1db87fa066d41d595220505b6b708183daae06a0b8db94140a5f6d294bcc5650f024385626e114e5d926b1679c8246008be40a540a2f5710b1c5 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-fs@npm:^0.10.0": + version: 0.10.0 + resolution: "@opentelemetry/instrumentation-fs@npm:0.10.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 4382ddeb28b663d218f47b2db533c2f4a350d9c38ca71b1a4b688b54f8f0333ce9f54ed411e294f0ce05cbf339897b2379ee8dfd7aaf6b3109077c86cc629a94 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-generic-pool@npm:^0.34.0": + version: 0.34.0 + resolution: "@opentelemetry/instrumentation-generic-pool@npm:0.34.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 0d55b59e65b6cf2af9942d303bc550da66455b718be5778330a0538f5c6ca27c18a2f82cb88dbeab98d4d8fb37ce761de1cd448e338701e57fd61bdb3b60b12a + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-graphql@npm:^0.38.1": + version: 0.38.1 + resolution: "@opentelemetry/instrumentation-graphql@npm:0.38.1" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: d148d1aa5ab661ab375bce5a0539e80836e0dc695936661a93e64a4f58b7b7c9617cca6d9989b15f6d7fa2a5ffbdd8c26ba43316416cdf527ce03cb9fc9165ac + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-grpc@npm:^0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/instrumentation-grpc@npm:0.49.1" + dependencies: + "@opentelemetry/instrumentation": 0.49.1 + "@opentelemetry/semantic-conventions": 1.22.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 55b22e2dffb6be63d57c97773b63fed9576307676d7919b16b005f47bce13a103437160966f2c01c2ed5aa71f135b36248d3db69c3030685a1e8ea9d4c42d4f9 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-hapi@npm:^0.35.0": + version: 0.35.0 + resolution: "@opentelemetry/instrumentation-hapi@npm:0.35.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + "@types/hapi__hapi": 20.0.13 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 23545b19597e3f7f65fb0ff06adb6d5ed9ce4675ebbc5153c243668b0476f99d298e097b7f2349b3eaa565bcab0c26e7985332b749624afd5b77172669b70217 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-http@npm:^0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/instrumentation-http@npm:0.49.1" + dependencies: + "@opentelemetry/core": 1.22.0 + "@opentelemetry/instrumentation": 0.49.1 + "@opentelemetry/semantic-conventions": 1.22.0 + semver: ^7.5.2 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: b3dc388f94a69202749cca70d71b5bcd3b713d67c40e0421b84d11a323080a76d645ea05fc551092022451cbbef6da303d806890e90f1784edde65adefd20e4d + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-ioredis@npm:^0.38.0": + version: 0.38.0 + resolution: "@opentelemetry/instrumentation-ioredis@npm:0.38.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/redis-common": ^0.36.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + "@types/ioredis4": "npm:@types/ioredis@^4.28.10" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 0b61f92db80ff89d00e93f3ef8b532c9439973ac0fd7d6b492a5faf46dc61d3c0b65b6b4359d69d23413db59b85e86a3857d82b00f810dd22be41014b3ff392d + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-knex@npm:^0.34.0": + version: 0.34.0 + resolution: "@opentelemetry/instrumentation-knex@npm:0.34.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 544b280c7a508bf4930f3d99dbce844358d066a1b7455c389916a6c13cab9d43ac5ff6eb1dd7e147988bc2636ca0e979f62883ee9c5941abcda29ba168af6165 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-koa@npm:^0.38.0": + version: 0.38.0 + resolution: "@opentelemetry/instrumentation-koa@npm:0.38.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + "@types/koa": 2.14.0 + "@types/koa__router": 12.0.3 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 7b76f6d03cbaeeda3a8a1e40790b76b52587365bd1ee2d2b04b65d62a527b9085c13827398e0422be4432f1b0dde3621246e7cbd85fa489aced58e085702e201 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-lru-memoizer@npm:^0.35.0": + version: 0.35.0 + resolution: "@opentelemetry/instrumentation-lru-memoizer@npm:0.35.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 9ef0231cf21c747fac86134402f36ea8561e8df694bc1e536b0f54af536e0a675e38c8d34c22628afbe6bc65ab5b5edebfe4de7b45d42e6e9d616afb60db62bf + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-memcached@npm:^0.34.0": + version: 0.34.0 + resolution: "@opentelemetry/instrumentation-memcached@npm:0.34.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + "@types/memcached": ^2.2.6 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: b2a9d97f78641074054e9a67458702785fb15ceb7c1e4868ab8f5ddde85826676e29094154fac19b0722a58a62e1311afc5fda69e883b2bd7e4780bb8dd3f2cb + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-mongodb@npm:^0.41.0": + version: 0.41.0 + resolution: "@opentelemetry/instrumentation-mongodb@npm:0.41.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/sdk-metrics": ^1.9.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 8fb991a1ea05a559d369e0274825b1f7e2a27f2aa4ddb8ecbf4e329efa35e115a19bd75864597918b74773319ad9dcbaf846e621dd286543d4f732399ab942b1 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-mongoose@npm:^0.36.0": + version: 0.36.0 + resolution: "@opentelemetry/instrumentation-mongoose@npm:0.36.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 7bc18b731f321090550e02930f2a2ffa4a99d7becd58b3cfba16c89f8c5e91a97e59abac4976864c98c13b5ce171f9b4131c723b13ec62657d9a0d8e3f74e79f + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-mysql2@npm:^0.36.0": + version: 0.36.0 + resolution: "@opentelemetry/instrumentation-mysql2@npm:0.36.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + "@opentelemetry/sql-common": ^0.40.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 3395f0d69c23d3a98e9e4d7085a36868b938eb5337c5f5bd540d6b4d025d90a6af89f28e01635e2558d963d2c28be1ba6bf63364767575dd39383fd6dfc82c89 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-mysql@npm:^0.36.0": + version: 0.36.0 + resolution: "@opentelemetry/instrumentation-mysql@npm:0.36.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + "@types/mysql": 2.15.22 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 705ab9e38e79a6db3be59eac718814c1cc71dea7d45e4da5257094625940f1e84002d9c5c8afa33f5bbc25ff012a66988d02b5be8fac521e2fc0fae353d9e013 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-nestjs-core@npm:^0.35.0": + version: 0.35.0 + resolution: "@opentelemetry/instrumentation-nestjs-core@npm:0.35.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: f878dc88d65e4ac876ca36a2e1f9c109aba14dd97f7aa8863b2231d90b57cb2526c74124690661a4d5fad8936d8c9b44c63c46563a5b89a1a57c86eb0ba01efd + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-net@npm:^0.34.0": + version: 0.34.0 + resolution: "@opentelemetry/instrumentation-net@npm:0.34.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: ed4dd2a9ea69314d519358733fcaee8a55d120cb8a5e85088b20626b753e5ddeea7a61e58b76d1e86b27c36828e9777a504ba405556046e9a30ef1bf12eeaa08 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-pg@npm:^0.39.1": + version: 0.39.1 + resolution: "@opentelemetry/instrumentation-pg@npm:0.39.1" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + "@opentelemetry/sql-common": ^0.40.0 + "@types/pg": 8.6.1 + "@types/pg-pool": 2.0.4 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 5e6276aaed45e88ccf019ce533a905570340160752e08e7e85c1bdfbe646ca6779046afd46c759cba18b2acec3dcb5bf80591807cf335bc2583d577725fdede8 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-pino@npm:^0.36.0": + version: 0.36.0 + resolution: "@opentelemetry/instrumentation-pino@npm:0.36.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: bf46db42c88930f64430a68c227b5b08deeb40518ad082a610524ad8efc5768d038117951032e89a86131eb0f95106368cba8d3fde091f906aa3e42e167c2c95 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-redis-4@npm:^0.37.0": + version: 0.37.0 + resolution: "@opentelemetry/instrumentation-redis-4@npm:0.37.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/redis-common": ^0.36.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 98208f8fe83bcf5e4fc9efeadff8724bc9eba4cfddc9c76630a30a582583e4d49842a47730429705c1d5931acbcc7223a4538194c43373c30ea6b0e326721db8 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-redis@npm:^0.37.0": + version: 0.37.0 + resolution: "@opentelemetry/instrumentation-redis@npm:0.37.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/redis-common": ^0.36.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 06ceaf8df2cfc7f197f981b6785af3160379eb94c4a7b3e0a0e60ca78c47b3f22599d3e9f030c52ff016da396418a0c31eb38282b207d0477aa42e8c9180ac2c + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-restify@npm:^0.36.0": + version: 0.36.0 + resolution: "@opentelemetry/instrumentation-restify@npm:0.36.0" + dependencies: + "@opentelemetry/core": ^1.8.0 + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: f7dbca7e2a10463575d33f27c9c7e3b9352732dfe3df646fa0772a61aaae4757d1e66ede740ebe41804a952de904447cc6823c82ece31db16b568f926e40bcaa + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-router@npm:^0.35.0": + version: 0.35.0 + resolution: "@opentelemetry/instrumentation-router@npm:0.35.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 3bdfba103b41f10c7fe7a650ad4f54cfa7a53b38afe69e05a0402b0157f2c393543b45e42febf05cc5c964ecb8667374a60ad25d00ce021180c70c02770e5f63 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-socket.io@npm:^0.37.0": + version: 0.37.0 + resolution: "@opentelemetry/instrumentation-socket.io@npm:0.37.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 21b790f53b91994a1241d7d3c5a400d5232001f740c13f64a0f48461e5db7974d2563e17059a44f567fb8dc4fb9078dc57738784b1474fb40e771e5d7bca67bb + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-tedious@npm:^0.8.0": + version: 0.8.0 + resolution: "@opentelemetry/instrumentation-tedious@npm:0.8.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + "@opentelemetry/semantic-conventions": ^1.0.0 + "@types/tedious": ^4.0.10 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 920a8446fb765f6833d926680ae4e6a7e7e4013e2f9145b20546e945848e3f9a31aabb6e37c087a9a7667457c7ec710cd5d6304279e67a6c7ddeda0d41501e01 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-winston@npm:^0.35.0": + version: 0.35.0 + resolution: "@opentelemetry/instrumentation-winston@npm:0.35.0" + dependencies: + "@opentelemetry/instrumentation": ^0.49.1 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: f4f2ef0adf049de6434906fd573e2465900e1f5c0f788c842978f6a43889c12dc04d15a8c079a615e9fe09df1eeabc0c2b93a219aff6f1106b2031b01f045d96 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation@npm:0.49.1, @opentelemetry/instrumentation@npm:^0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/instrumentation@npm:0.49.1" + dependencies: + "@opentelemetry/api-logs": 0.49.1 + "@types/shimmer": ^1.0.2 + import-in-the-middle: 1.7.1 + require-in-the-middle: ^7.1.1 + semver: ^7.5.2 + shimmer: ^1.2.1 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 87379f8505118c850f73947784fd57fbaa2667fbf5ca8bd0a91a0782d0a240ab92e9091cd4107a6785d37e4976a6f1fb20b89a1d9ac9bec6faf858681a7d8707 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation@npm:0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/instrumentation@npm:0.50.0" + dependencies: + "@opentelemetry/api-logs": 0.50.0 + "@types/shimmer": ^1.0.2 + import-in-the-middle: 1.7.1 + require-in-the-middle: ^7.1.1 + semver: ^7.5.2 + shimmer: ^1.2.1 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 371398639ca68c188d4b77a0034ea369222a2a1de421be37190900bade1210802a50b53cc48fd21206917817319a92a4cb52bd92bd534889355b54316145e634 + languageName: node + linkType: hard + +"@opentelemetry/otlp-exporter-base@npm:0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/otlp-exporter-base@npm:0.49.1" + dependencies: + "@opentelemetry/core": 1.22.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 43b2237b83811ccb632b0e6a5a6b824627c1c05670c0ca158f0686278ec6d1dc32d8780d0fde8c496531e6b7fbe780e154aa5dc53b911b49c927f0566bcc795d + languageName: node + linkType: hard + +"@opentelemetry/otlp-exporter-base@npm:0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/otlp-exporter-base@npm:0.50.0" + dependencies: + "@opentelemetry/core": 1.23.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: e1e6586a64d753e542f28858c1618776deeaf639afd50e4ff325c14f7571ac91546928d0f2f89b2287e7cdbadf3211e3f9dd844139f64e6253e99f71b6cc1f07 + languageName: node + linkType: hard + +"@opentelemetry/otlp-grpc-exporter-base@npm:0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.49.1" + dependencies: + "@grpc/grpc-js": ^1.7.1 + "@opentelemetry/core": 1.22.0 + "@opentelemetry/otlp-exporter-base": 0.49.1 + protobufjs: ^7.2.3 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 7d8065ea161ba105060856ec448d2fdbbb725fd397bfd47a3281929249af3995373619d8e8c6504ca22893d1e1cffe12f3af220988d06e2b1576c8ac26edb86e + languageName: node + linkType: hard + +"@opentelemetry/otlp-grpc-exporter-base@npm:0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.50.0" + dependencies: + "@grpc/grpc-js": ^1.7.1 + "@opentelemetry/core": 1.23.0 + "@opentelemetry/otlp-exporter-base": 0.50.0 + protobufjs: ^7.2.3 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 97a4e69d2834c840f1f037737eb378c309e5645002490b5bc51b836303a205a65658e2b1ec512dd613207626517efbe744b46225a9b3079b782cdda0a168fcf6 + languageName: node + linkType: hard + +"@opentelemetry/otlp-proto-exporter-base@npm:0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/otlp-proto-exporter-base@npm:0.49.1" + dependencies: + "@opentelemetry/core": 1.22.0 + "@opentelemetry/otlp-exporter-base": 0.49.1 + protobufjs: ^7.2.3 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: b381e1022855867b621ad04252cad7376445c6a110073c8715f1c41b782b5dbad668f2acee2aecfca348c49a3f2adb4c16297d99fe9d3068b1746314cc6d4c13 + languageName: node + linkType: hard + +"@opentelemetry/otlp-proto-exporter-base@npm:0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/otlp-proto-exporter-base@npm:0.50.0" + dependencies: + "@opentelemetry/core": 1.23.0 + "@opentelemetry/otlp-exporter-base": 0.50.0 + protobufjs: ^7.2.3 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: d39f61a5ca31ac9cbb6ac7e77c71afebc7b40bf247361c99e34f8c00aeae88db1d4c7e6742f9dd01d2334ee50c7db8e24d7d9df67a65ee005c947358611f2050 + languageName: node + linkType: hard + +"@opentelemetry/otlp-transformer@npm:0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/otlp-transformer@npm:0.49.1" + dependencies: + "@opentelemetry/api-logs": 0.49.1 + "@opentelemetry/core": 1.22.0 + "@opentelemetry/resources": 1.22.0 + "@opentelemetry/sdk-logs": 0.49.1 + "@opentelemetry/sdk-metrics": 1.22.0 + "@opentelemetry/sdk-trace-base": 1.22.0 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.9.0" + checksum: 1f79e796a452168f353a3dfead3ae3e3206a30fa68d690721d7377e78f9e2ba0f3de32621fd8743b3c47c9b8c22034bf7f9b209327d2d09caa8a08f13288eeb0 + languageName: node + linkType: hard + +"@opentelemetry/otlp-transformer@npm:0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/otlp-transformer@npm:0.50.0" + dependencies: + "@opentelemetry/api-logs": 0.50.0 + "@opentelemetry/core": 1.23.0 + "@opentelemetry/resources": 1.23.0 + "@opentelemetry/sdk-logs": 0.50.0 + "@opentelemetry/sdk-metrics": 1.23.0 + "@opentelemetry/sdk-trace-base": 1.23.0 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.9.0" + checksum: d2637146cdb1a3c7c311f03c8d8a11c1c4b57c63ac3532865096055d603a334bb4b5a63cecaba96f27dd0f3b8b4c7ffcebd248d85c47b7e60a5b5e7ae821219c + languageName: node + linkType: hard + +"@opentelemetry/propagation-utils@npm:^0.30.7": + version: 0.30.9 + resolution: "@opentelemetry/propagation-utils@npm:0.30.9" + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 4cc6e645ed7334fc1773396854c95aaabd5c5a307ede85ee8533e362fff4fa290a6efa36b35ced7a7d73894f575d07bd4daae4331ddd62536a4847efdd9354b0 + languageName: node + linkType: hard + +"@opentelemetry/propagator-aws-xray@npm:^1.3.1": + version: 1.24.0 + resolution: "@opentelemetry/propagator-aws-xray@npm:1.24.0" + dependencies: + "@opentelemetry/core": 1.24.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 51d78403749e110c31f916a82edef2c5d1df1e8a1a9ada8dd420bf3ef5c1baafb0748193cd74fbb3975745110afe99602d5977a0e38690c9ba53e2166c28d4c5 + languageName: node + linkType: hard + +"@opentelemetry/propagator-b3@npm:1.22.0": + version: 1.22.0 + resolution: "@opentelemetry/propagator-b3@npm:1.22.0" + dependencies: + "@opentelemetry/core": 1.22.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: f072fcfaa2c126b84f7f9b060fa66fff36fbe3f425123f6aec9a99094d20296dc781d3c61e765b2727e957fcad311fd4f58da70ed51bf152fbc21202d78d70a5 + languageName: node + linkType: hard + +"@opentelemetry/propagator-b3@npm:1.23.0": + version: 1.23.0 + resolution: "@opentelemetry/propagator-b3@npm:1.23.0" + dependencies: + "@opentelemetry/core": 1.23.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 8478a4ac3fcad3ea53ed7af70c7da22dee48a262aef2bb2c64a039a3aff1368476b23ce385b95b3c34334a29d7964c98ca3c08bc05dd2999a891faf3ab858799 + languageName: node + linkType: hard + +"@opentelemetry/propagator-jaeger@npm:1.22.0": + version: 1.22.0 + resolution: "@opentelemetry/propagator-jaeger@npm:1.22.0" + dependencies: + "@opentelemetry/core": 1.22.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 0d998bd160b6d812ebc61b8ba75009688cf2d0feaeb4389c8f6bb32d2a02c16f7cf6a77d1bc5f773bf5663f31ca3fa7ec2dc79cf6d9909ffb5098297f6357a86 + languageName: node + linkType: hard + +"@opentelemetry/propagator-jaeger@npm:1.23.0": + version: 1.23.0 + resolution: "@opentelemetry/propagator-jaeger@npm:1.23.0" + dependencies: + "@opentelemetry/core": 1.23.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 240f27f15473704a5cf8549ea22b1640d865ef40c3da65b023e7f44cc89422b9f983061e4508a3f4576339907625c8f725c42e7f5e77c243c833e03d9490880d + languageName: node + linkType: hard + +"@opentelemetry/redis-common@npm:^0.36.1": + version: 0.36.2 + resolution: "@opentelemetry/redis-common@npm:0.36.2" + checksum: b0a6f2c2dc64ba3b655ed944a5a33715d00365865e6f498005527a4ad6c40ca0e7b8ac531791b6d5abfbab9b22d9c6aa1cd8bcc851a7634dfb381ad2d5061b0d + languageName: node + linkType: hard + +"@opentelemetry/resource-detector-alibaba-cloud@npm:^0.28.7": + version: 0.28.9 + resolution: "@opentelemetry/resource-detector-alibaba-cloud@npm:0.28.9" + dependencies: + "@opentelemetry/resources": ^1.0.0 + "@opentelemetry/semantic-conventions": ^1.22.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 8ac05377da60c7c1a958509849989d2151a29c341819def6033f65e5302066dec77ad0358a117d40eef22cbb3537956bb492a15e524a86131f92e0e5d9a91c16 + languageName: node + linkType: hard + +"@opentelemetry/resource-detector-aws@npm:^1.4.0": + version: 1.4.2 + resolution: "@opentelemetry/resource-detector-aws@npm:1.4.2" + dependencies: + "@opentelemetry/core": ^1.0.0 + "@opentelemetry/resources": ^1.0.0 + "@opentelemetry/semantic-conventions": ^1.22.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 66a7c90f037bccb0a754701182b6ec89982f8ba1d46bc07c0b4db6debe69dc504482fe65bdb3867c8ddf8f18e899a657cbb0c6bf5e677becb2ec08be8c3538f1 + languageName: node + linkType: hard + +"@opentelemetry/resource-detector-container@npm:^0.3.7": + version: 0.3.9 + resolution: "@opentelemetry/resource-detector-container@npm:0.3.9" + dependencies: + "@opentelemetry/resources": ^1.0.0 + "@opentelemetry/semantic-conventions": ^1.22.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: c2157f4d9b602c6fd32ad27c2b0ee8dd944542b18c025363d47fd9b38458ee2107f442dab957e8d4107c8ac7cc049cdc09779965cb309ab3fedb5b52fafbcb30 + languageName: node + linkType: hard + +"@opentelemetry/resource-detector-gcp@npm:^0.29.7": + version: 0.29.9 + resolution: "@opentelemetry/resource-detector-gcp@npm:0.29.9" + dependencies: + "@opentelemetry/core": ^1.0.0 + "@opentelemetry/resources": ^1.0.0 + "@opentelemetry/semantic-conventions": ^1.22.0 + gcp-metadata: ^6.0.0 + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 4829cef6e5d849cae34320751c172ac9583ae12a9336db48ffa8ae47c288ca8d86d5b2ec19f20881fdd9505b6f3f12eeadd59f9dd341187dc8702f0a68d7e4d0 + languageName: node + linkType: hard + +"@opentelemetry/resources@npm:1.22.0": + version: 1.22.0 + resolution: "@opentelemetry/resources@npm:1.22.0" + dependencies: + "@opentelemetry/core": 1.22.0 + "@opentelemetry/semantic-conventions": 1.22.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: f1da492d9fa7dbe3e5f08a511654b45265fcd16c4695bb1ae92488baa45ae9910d5a962166aaa4ae63be4c75393680c6f064450a5f10b86501b9df427ac49f27 + languageName: node + linkType: hard + "@opentelemetry/resources@npm:1.23.0": version: 1.23.0 resolution: "@opentelemetry/resources@npm:1.23.0" @@ -11951,7 +13040,58 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-metrics@npm:1.23.0, @opentelemetry/sdk-metrics@npm:^1.13.0": +"@opentelemetry/resources@npm:1.24.0, @opentelemetry/resources@npm:^1.0.0, @opentelemetry/resources@npm:^1.12.0, @opentelemetry/resources@npm:^1.8.0": + version: 1.24.0 + resolution: "@opentelemetry/resources@npm:1.24.0" + dependencies: + "@opentelemetry/core": 1.24.0 + "@opentelemetry/semantic-conventions": 1.24.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: b9a59d4267388aaec8d4adc1d708220209bdba1f60ef80fdf1436a23a4e1e04d0c05c33bf1cd08bec7ab75d1b7d2311d25bbe62253bd1d6efbb64102a7018958 + languageName: node + linkType: hard + +"@opentelemetry/sdk-logs@npm:0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/sdk-logs@npm:0.49.1" + dependencies: + "@opentelemetry/core": 1.22.0 + "@opentelemetry/resources": 1.22.0 + peerDependencies: + "@opentelemetry/api": ">=1.4.0 <1.9.0" + "@opentelemetry/api-logs": ">=0.39.1" + checksum: 9c2a60a15fd5a40316b96805a23d96dffb62258d78d20edcc0a9dedcb89aa410ab592d67c315fa63138657cb717d7e9e406337b16bee89a7115bdfe8a190190b + languageName: node + linkType: hard + +"@opentelemetry/sdk-logs@npm:0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/sdk-logs@npm:0.50.0" + dependencies: + "@opentelemetry/core": 1.23.0 + "@opentelemetry/resources": 1.23.0 + peerDependencies: + "@opentelemetry/api": ">=1.4.0 <1.9.0" + "@opentelemetry/api-logs": ">=0.39.1" + checksum: e93be98f4ea2b64dd0fc0aebc5dfa7276f995a0822cae727455988397cb0c10f7696dbabc4d01a7b09d515faceffa2858c3329a85841ae79c44072e8c0911df8 + languageName: node + linkType: hard + +"@opentelemetry/sdk-metrics@npm:1.22.0": + version: 1.22.0 + resolution: "@opentelemetry/sdk-metrics@npm:1.22.0" + dependencies: + "@opentelemetry/core": 1.22.0 + "@opentelemetry/resources": 1.22.0 + lodash.merge: ^4.6.2 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.9.0" + checksum: 43b6599432bece2e41a48d40653f4f928ad7ba0b74c50a17bdb38f13bcb47cec1e08ce9af7f8cc643dc2c28cb127ef5ef4ce3e53cd1bf386d54fdaca361f29f2 + languageName: node + linkType: hard + +"@opentelemetry/sdk-metrics@npm:1.23.0": version: 1.23.0 resolution: "@opentelemetry/sdk-metrics@npm:1.23.0" dependencies: @@ -11964,6 +13104,130 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/sdk-metrics@npm:^1.9.1": + version: 1.24.0 + resolution: "@opentelemetry/sdk-metrics@npm:1.24.0" + dependencies: + "@opentelemetry/core": 1.24.0 + "@opentelemetry/resources": 1.24.0 + lodash.merge: ^4.6.2 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.9.0" + checksum: 4468302b048685fa06c03c434754a37a671c4b1ae9a0409ad53132742eac7c982a65712bee4614f2d46e1fd361ec012afc55f693f00316808573f5c427cb68b9 + languageName: node + linkType: hard + +"@opentelemetry/sdk-node@npm:^0.49.1": + version: 0.49.1 + resolution: "@opentelemetry/sdk-node@npm:0.49.1" + dependencies: + "@opentelemetry/api-logs": 0.49.1 + "@opentelemetry/core": 1.22.0 + "@opentelemetry/exporter-trace-otlp-grpc": 0.49.1 + "@opentelemetry/exporter-trace-otlp-http": 0.49.1 + "@opentelemetry/exporter-trace-otlp-proto": 0.49.1 + "@opentelemetry/exporter-zipkin": 1.22.0 + "@opentelemetry/instrumentation": 0.49.1 + "@opentelemetry/resources": 1.22.0 + "@opentelemetry/sdk-logs": 0.49.1 + "@opentelemetry/sdk-metrics": 1.22.0 + "@opentelemetry/sdk-trace-base": 1.22.0 + "@opentelemetry/sdk-trace-node": 1.22.0 + "@opentelemetry/semantic-conventions": 1.22.0 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.9.0" + checksum: eb1ef8ddb33de7a4e8be697ed0eca100a4d728f41f7c8fca5a06f3facf5a1c2a4fce3d9585a29f47d958904a920024dd6637907e810cc9fb4b702cc8970136eb + languageName: node + linkType: hard + +"@opentelemetry/sdk-node@npm:^0.50.0": + version: 0.50.0 + resolution: "@opentelemetry/sdk-node@npm:0.50.0" + dependencies: + "@opentelemetry/api-logs": 0.50.0 + "@opentelemetry/core": 1.23.0 + "@opentelemetry/exporter-trace-otlp-grpc": 0.50.0 + "@opentelemetry/exporter-trace-otlp-http": 0.50.0 + "@opentelemetry/exporter-trace-otlp-proto": 0.50.0 + "@opentelemetry/exporter-zipkin": 1.23.0 + "@opentelemetry/instrumentation": 0.50.0 + "@opentelemetry/resources": 1.23.0 + "@opentelemetry/sdk-logs": 0.50.0 + "@opentelemetry/sdk-metrics": 1.23.0 + "@opentelemetry/sdk-trace-base": 1.23.0 + "@opentelemetry/sdk-trace-node": 1.23.0 + "@opentelemetry/semantic-conventions": 1.23.0 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.9.0" + checksum: 1ca47e0cec7832a291e20fc838bfb2a7307b6d041a29b0ace1a5f3eb9f77fa8bad6e40d55eb19e5ab7c153afb866890bfc415e843d6b950691527566a592ad35 + languageName: node + linkType: hard + +"@opentelemetry/sdk-trace-base@npm:1.22.0": + version: 1.22.0 + resolution: "@opentelemetry/sdk-trace-base@npm:1.22.0" + dependencies: + "@opentelemetry/core": 1.22.0 + "@opentelemetry/resources": 1.22.0 + "@opentelemetry/semantic-conventions": 1.22.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 9a15bca01532b9bd279fcf7c083af7e39c24187c6793aa6ce0e6f780394abc12458fc5ae67bff279afd9392ccd67f5d1823c326d4f4511d789667ba2a878d56c + languageName: node + linkType: hard + +"@opentelemetry/sdk-trace-base@npm:1.23.0": + version: 1.23.0 + resolution: "@opentelemetry/sdk-trace-base@npm:1.23.0" + dependencies: + "@opentelemetry/core": 1.23.0 + "@opentelemetry/resources": 1.23.0 + "@opentelemetry/semantic-conventions": 1.23.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 564a14a38b151d793949da95949a5eb4e0034ff95356162a7fcf7fe6a81b312cd8d601d6e46b303e6d9f785152ff28621cb7bd114f61e064bfdfa77ed28ca8cc + languageName: node + linkType: hard + +"@opentelemetry/sdk-trace-node@npm:1.22.0": + version: 1.22.0 + resolution: "@opentelemetry/sdk-trace-node@npm:1.22.0" + dependencies: + "@opentelemetry/context-async-hooks": 1.22.0 + "@opentelemetry/core": 1.22.0 + "@opentelemetry/propagator-b3": 1.22.0 + "@opentelemetry/propagator-jaeger": 1.22.0 + "@opentelemetry/sdk-trace-base": 1.22.0 + semver: ^7.5.2 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: fcd755be1355b211551e54d6a36d46f196fd9bec30b2eff0dc935082a59a86df3f9e9460a6d0b1f540063627f0baf1780f504ec13653a08a2954985d06888ac0 + languageName: node + linkType: hard + +"@opentelemetry/sdk-trace-node@npm:1.23.0": + version: 1.23.0 + resolution: "@opentelemetry/sdk-trace-node@npm:1.23.0" + dependencies: + "@opentelemetry/context-async-hooks": 1.23.0 + "@opentelemetry/core": 1.23.0 + "@opentelemetry/propagator-b3": 1.23.0 + "@opentelemetry/propagator-jaeger": 1.23.0 + "@opentelemetry/sdk-trace-base": 1.23.0 + semver: ^7.5.2 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 165f26d77672d6745e9b1d3af78e3b1afcd4fe1b48e0eaef1aa67e9c86e822f9d0947cb0066c6a1080bdcf03c9da268870cace839254d1fee03446b25dbf6d30 + languageName: node + linkType: hard + +"@opentelemetry/semantic-conventions@npm:1.22.0": + version: 1.22.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.22.0" + checksum: cb3bdca1a29d3c32c44599bdf5ee5143b84e81aaa61edcd3f750133bfaffd7c1b36755c877921e4993e2468284a0564388844a7dda388122bee486d3f67fa4c8 + languageName: node + linkType: hard + "@opentelemetry/semantic-conventions@npm:1.23.0": version: 1.23.0 resolution: "@opentelemetry/semantic-conventions@npm:1.23.0" @@ -11971,6 +13235,24 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/semantic-conventions@npm:1.24.0, @opentelemetry/semantic-conventions@npm:^1.0.0, @opentelemetry/semantic-conventions@npm:^1.22.0": + version: 1.24.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.24.0" + checksum: ba7c71602f3eddc3f015457cf1183bd24f0300b2636b57cafe2e5196ae233daf05e573e3a7b954818e8f2d9543a44282a0406f327b9c066ae948eea5f4a91d27 + languageName: node + linkType: hard + +"@opentelemetry/sql-common@npm:^0.40.0": + version: 0.40.1 + resolution: "@opentelemetry/sql-common@npm:0.40.1" + dependencies: + "@opentelemetry/core": ^1.1.0 + peerDependencies: + "@opentelemetry/api": ^1.1.0 + checksum: 23529740531937dee137c9680dbd2f7abf6a7d7340fbd48d309707601fa6255a5e8c2626c8e1c285b49c0b3429f2b3a8e6cbf7f7240820ecfeb52e2ba5ed6740 + languageName: node + linkType: hard + "@oriflame/backstage-plugin-score-card@npm:^0.8.0": version: 0.8.0 resolution: "@oriflame/backstage-plugin-score-card@npm:0.8.0" @@ -13303,6 +14585,29 @@ __metadata: languageName: node linkType: hard +"@sideway/address@npm:^4.1.5": + version: 4.1.5 + resolution: "@sideway/address@npm:4.1.5" + dependencies: + "@hapi/hoek": ^9.0.0 + checksum: 3e3ea0f00b4765d86509282290368a4a5fd39a7995fdc6de42116ca19a96120858e56c2c995081def06e1c53e1f8bccc7d013f6326602bec9d56b72ee2772b9d + languageName: node + linkType: hard + +"@sideway/formula@npm:^3.0.1": + version: 3.0.1 + resolution: "@sideway/formula@npm:3.0.1" + checksum: e4beeebc9dbe2ff4ef0def15cec0165e00d1612e3d7cea0bc9ce5175c3263fc2c818b679bd558957f49400ee7be9d4e5ac90487e1625b4932e15c4aa7919c57a + languageName: node + linkType: hard + +"@sideway/pinpoint@npm:^2.0.0": + version: 2.0.0 + resolution: "@sideway/pinpoint@npm:2.0.0" + checksum: 0f4491e5897fcf5bf02c46f5c359c56a314e90ba243f42f0c100437935daa2488f20482f0f77186bd6bf43345095a95d8143ecf8b1f4d876a7bc0806aba9c3d2 + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.27.8": version: 0.27.8 resolution: "@sinclair/typebox@npm:0.27.8" @@ -15343,6 +16648,15 @@ __metadata: languageName: node linkType: hard +"@types/accepts@npm:*": + version: 1.3.7 + resolution: "@types/accepts@npm:1.3.7" + dependencies: + "@types/node": "*" + checksum: 7678cf74976e16093aff6e6f9755826faf069ac1e30179276158ce46ea246348ff22ca6bdd46cef08428881337d9ceefbf00bab08a7731646eb9fc9449d6a1e7 + languageName: node + linkType: hard + "@types/ansi-regex@npm:^5.0.0": version: 5.0.0 resolution: "@types/ansi-regex@npm:5.0.0" @@ -15375,10 +16689,10 @@ __metadata: languageName: node linkType: hard -"@types/aws-lambda@npm:^8.10.83": - version: 8.10.92 - resolution: "@types/aws-lambda@npm:8.10.92" - checksum: 71c44d83a1c88aa6dbc920baedfb2d100b8843a3d210c695ccaafb30dfb75f04398b0e5368100022acbf75c55d456c61774242f20dd70915fc63d85430cbcf8a +"@types/aws-lambda@npm:8.10.122, @types/aws-lambda@npm:^8.10.83": + version: 8.10.122 + resolution: "@types/aws-lambda@npm:8.10.122" + checksum: 5c2e02ae8fc0eea90fa3b1014f401a8567695e65910fb53452e813b9b58761c956fba50ac7da606b97e07d881d264ff513573d279e7116f3c6b9590fdb093f31 languageName: node linkType: hard @@ -15467,6 +16781,15 @@ __metadata: languageName: node linkType: hard +"@types/bunyan@npm:1.8.9": + version: 1.8.9 + resolution: "@types/bunyan@npm:1.8.9" + dependencies: + "@types/node": "*" + checksum: 0635ca1906acda4fbce5aed0b9ba16c857e13081724ae5d30aae61083f03f80b299f05e8e573e2804e530ec4b7c2a68ee7f2f522afde664a41122d16e0a39db0 + languageName: node + linkType: hard + "@types/cacheable-request@npm:^6.0.1": version: 6.0.1 resolution: "@types/cacheable-request@npm:6.0.1" @@ -15557,12 +16880,19 @@ __metadata: languageName: node linkType: hard -"@types/connect@npm:*": - version: 3.4.33 - resolution: "@types/connect@npm:3.4.33" +"@types/connect@npm:*, @types/connect@npm:3.4.36": + version: 3.4.36 + resolution: "@types/connect@npm:3.4.36" dependencies: "@types/node": "*" - checksum: 1220403e0cd05c6f51c03b83eed0f4e086f252d50c13279effd38d8bfea5cae82db012b134d31004cb8e4705f83d8ad62dddd71028baa190bf6f31c8d9ac916b + checksum: 4dee3d966fb527b98f0cbbdcf6977c9193fc3204ed539b7522fe5e64dfa45f9017bdda4ffb1f760062262fce7701a0ee1c2f6ce2e50af36c74d4e37052303172 + languageName: node + linkType: hard + +"@types/content-disposition@npm:*": + version: 0.5.8 + resolution: "@types/content-disposition@npm:0.5.8" + checksum: eeea868fb510ae7a32aa2d7de680fba79d59001f3e758a334621e10bc0a6496d3a42bb79243a5e53b9c63cb524522853ccc144fe1ab160c4247d37cdb81146c4 languageName: node linkType: hard @@ -15596,6 +16926,18 @@ __metadata: languageName: node linkType: hard +"@types/cookies@npm:*": + version: 0.9.0 + resolution: "@types/cookies@npm:0.9.0" + dependencies: + "@types/connect": "*" + "@types/express": "*" + "@types/keygrip": "*" + "@types/node": "*" + checksum: ce59bfdf3a5d750400ac32aa93157ec7be997dc632660cf0bbfd76df23d71a70bb5f0820558cd26b9a5576f86b6664a2fd23ae211b51202a5b2f9a15995d7331 + languageName: node + linkType: hard + "@types/core-js@npm:^2.5.4": version: 2.5.8 resolution: "@types/core-js@npm:2.5.8" @@ -15872,6 +17214,47 @@ __metadata: languageName: node linkType: hard +"@types/hapi__catbox@npm:*": + version: 10.2.6 + resolution: "@types/hapi__catbox@npm:10.2.6" + checksum: 06cd8f4bced5ee912ec89daa53c10a416ab8d7c25ebf981dc3525a9fcc744afcfafd7353146ab8612a71b8905851e44613579ef89ab0c0cef2def0f27aeac480 + languageName: node + linkType: hard + +"@types/hapi__hapi@npm:20.0.13": + version: 20.0.13 + resolution: "@types/hapi__hapi@npm:20.0.13" + dependencies: + "@hapi/boom": ^9.0.0 + "@hapi/iron": ^6.0.0 + "@hapi/podium": ^4.1.3 + "@types/hapi__catbox": "*" + "@types/hapi__mimos": "*" + "@types/hapi__shot": "*" + "@types/node": "*" + joi: ^17.3.0 + checksum: 02d0f91b3b0900e05b6e8d31ae664e20d9c41238155c56fe8c4ca3e8f3d6bc99a8be117eb9aced2141435c855ce8be9bade575ce97af0d5ba8939268ba40d798 + languageName: node + linkType: hard + +"@types/hapi__mimos@npm:*": + version: 4.1.4 + resolution: "@types/hapi__mimos@npm:4.1.4" + dependencies: + "@types/mime-db": "*" + checksum: 8cae226b3d38427d3a380840506be0f226b0494d3e00826c2ff093e38e4f0ec2254d790531110f874b2ed6ac482eceaf5ac628a5e71898c49aea5d29a4875568 + languageName: node + linkType: hard + +"@types/hapi__shot@npm:*": + version: 4.1.6 + resolution: "@types/hapi__shot@npm:4.1.6" + dependencies: + "@types/node": "*" + checksum: 12fdb024a69890c0f552e5953c8afb76bf023c5315b8d70aeb9609c382efb63907a60ae5b048675c82fea5df9c3bad52befdef78df5758f6cf3d00b8cfee628d + languageName: node + linkType: hard + "@types/hast@npm:^2.0.0": version: 2.3.4 resolution: "@types/hast@npm:2.3.4" @@ -15907,6 +17290,13 @@ __metadata: languageName: node linkType: hard +"@types/http-assert@npm:*": + version: 1.5.5 + resolution: "@types/http-assert@npm:1.5.5" + checksum: cd6bb7fd42cc6e2a702cb55370b8b25231954ad74c04bcd185b943a74ded3d4c28099c30f77b26951df2426441baff41718816c60b5af80efe2b8888d900bf93 + languageName: node + linkType: hard + "@types/http-cache-semantics@npm:*": version: 4.0.0 resolution: "@types/http-cache-semantics@npm:4.0.0" @@ -15956,6 +17346,15 @@ __metadata: languageName: node linkType: hard +"@types/ioredis4@npm:@types/ioredis@^4.28.10": + version: 4.28.10 + resolution: "@types/ioredis@npm:4.28.10" + dependencies: + "@types/node": "*" + checksum: 0f2788cf25f490d3b345db8c5f8b8ce3f6c92cc99abcf744c8f974f02b9b3875233b3d22098614c462a0d6c41c523bd655509418ea88eb6249db6652290ce7cf + languageName: node + linkType: hard + "@types/is-glob@npm:^4.0.2": version: 4.0.4 resolution: "@types/is-glob@npm:4.0.4" @@ -16090,6 +17489,13 @@ __metadata: languageName: node linkType: hard +"@types/keygrip@npm:*": + version: 1.0.6 + resolution: "@types/keygrip@npm:1.0.6" + checksum: d157f60bf920492347791d2b26d530d5069ce05796549fbacd4c24d66ffbebbcb0ab67b21e7a1b80a593b9fd4b67dc4843dec04c12bbc2e0fddfb8577a826c41 + languageName: node + linkType: hard + "@types/keyv@npm:*, @types/keyv@npm:^3.1.1": version: 3.1.4 resolution: "@types/keyv@npm:3.1.4" @@ -16099,6 +17505,56 @@ __metadata: languageName: node linkType: hard +"@types/koa-compose@npm:*": + version: 3.2.8 + resolution: "@types/koa-compose@npm:3.2.8" + dependencies: + "@types/koa": "*" + checksum: 95c32bdee738ac7c10439bbf6342ca3b9f0aafd7e8118739eac7fb0fa703a23cfe4c88f63e13a69a16fbde702e0bcdc62b272aa734325fc8efa7e5625479752e + languageName: node + linkType: hard + +"@types/koa@npm:*": + version: 2.15.0 + resolution: "@types/koa@npm:2.15.0" + dependencies: + "@types/accepts": "*" + "@types/content-disposition": "*" + "@types/cookies": "*" + "@types/http-assert": "*" + "@types/http-errors": "*" + "@types/keygrip": "*" + "@types/koa-compose": "*" + "@types/node": "*" + checksum: f429b92f36f96c8f5ceb5333f982400d0db20e177b7d89a7a576ac6f63aff8c964f7ab313e2e281a07bbb93931c66327fb42614cd4984b2ef33dfe7cbd76d741 + languageName: node + linkType: hard + +"@types/koa@npm:2.14.0": + version: 2.14.0 + resolution: "@types/koa@npm:2.14.0" + dependencies: + "@types/accepts": "*" + "@types/content-disposition": "*" + "@types/cookies": "*" + "@types/http-assert": "*" + "@types/http-errors": "*" + "@types/keygrip": "*" + "@types/koa-compose": "*" + "@types/node": "*" + checksum: 57d809e42350c9ddefa2150306355e40757877468bb027e0bd99f5aeb43cfaf8ba8b14761ea65e419d6fb4c2403a1f3ed0762872a9cf040dbd14357caca56548 + languageName: node + linkType: hard + +"@types/koa__router@npm:12.0.3": + version: 12.0.3 + resolution: "@types/koa__router@npm:12.0.3" + dependencies: + "@types/koa": "*" + checksum: e9cdc53e01a6b2340583e94982cec2720c2d4c582240438eca57db7db4596f707578ac3e32cd32ace787331de304b6292cca8c98b0233c77f8749493c4991c96 + languageName: node + linkType: hard + "@types/ldapjs@npm:^2.2.5": version: 2.2.5 resolution: "@types/ldapjs@npm:2.2.5" @@ -16159,6 +17615,22 @@ __metadata: languageName: node linkType: hard +"@types/memcached@npm:^2.2.6": + version: 2.2.10 + resolution: "@types/memcached@npm:2.2.10" + dependencies: + "@types/node": "*" + checksum: c95e2ed494d5df5e45bab024d24ff2ba45930eb9737cb86564a5ac2a0b3fb5dfdc23d8a65061da38ffe2aabe202a8d333764c0c3dc99d2bb205bff8ba620f2c2 + languageName: node + linkType: hard + +"@types/mime-db@npm:*": + version: 1.43.5 + resolution: "@types/mime-db@npm:1.43.5" + checksum: 83a994ba20d5e1f5ad7bf9d408dd01631ce80d0bfdedabac5af046810f5d6e94b6d9f34bcbad85c2e02516851c946e034ba4122d4f5168b30a008fc19c2292fe + languageName: node + linkType: hard + "@types/mime-types@npm:^2.1.0": version: 2.1.4 resolution: "@types/mime-types@npm:2.1.4" @@ -16235,6 +17707,15 @@ __metadata: languageName: node linkType: hard +"@types/mysql@npm:2.15.22": + version: 2.15.22 + resolution: "@types/mysql@npm:2.15.22" + dependencies: + "@types/node": "*" + checksum: 325120f027b04052b3ed056fef096d186ecc0988d9efe110a52bd3f2233d02e17fb802ea42da7fa1ae1d150b0194cddf56ff71bfb28411bc05361f947b0635af + languageName: node + linkType: hard + "@types/ndjson@npm:^2.0.1": version: 2.0.4 resolution: "@types/ndjson@npm:2.0.4" @@ -16437,7 +17918,16 @@ __metadata: languageName: node linkType: hard -"@types/pg@npm:^8.6.6": +"@types/pg-pool@npm:2.0.4": + version: 2.0.4 + resolution: "@types/pg-pool@npm:2.0.4" + dependencies: + "@types/pg": "*" + checksum: 5ae1c49fe1820ec011f8e2a877198a62f4c9795d2cc340dff4527c26f24ee22dffe99a8ca5cdec6edb54613bded820cc51256fb668e0eb4d22794181b94fad82 + languageName: node + linkType: hard + +"@types/pg@npm:*, @types/pg@npm:^8.6.6": version: 8.11.6 resolution: "@types/pg@npm:8.11.6" dependencies: @@ -16448,6 +17938,17 @@ __metadata: languageName: node linkType: hard +"@types/pg@npm:8.6.1": + version: 8.6.1 + resolution: "@types/pg@npm:8.6.1" + dependencies: + "@types/node": "*" + pg-protocol: "*" + pg-types: ^2.2.0 + checksum: a44710ff06e70f57685ddb88edbb93d4b46e03fed90619f09853ed3868ab28541c4da03eccf6b0b444a7566a0b3c56028543ced43554d51168ca3f8ae15e194f + languageName: node + linkType: hard + "@types/picomatch@npm:2.3.3": version: 2.3.3 resolution: "@types/picomatch@npm:2.3.3" @@ -16759,6 +18260,13 @@ __metadata: languageName: node linkType: hard +"@types/shimmer@npm:^1.0.2": + version: 1.0.5 + resolution: "@types/shimmer@npm:1.0.5" + checksum: f6b0c950dc9187464c5393faf4f4e2b7b44b16665bb49196da28affecceb4fdcd9749af15cbe50f1a2de39f3a84b7523e73445f117f6b48bdbd61b892568364a + languageName: node + linkType: hard + "@types/sinon@npm:^10.0.10": version: 10.0.13 resolution: "@types/sinon@npm:10.0.13" @@ -16889,6 +18397,15 @@ __metadata: languageName: node linkType: hard +"@types/tedious@npm:^4.0.10": + version: 4.0.14 + resolution: "@types/tedious@npm:4.0.14" + dependencies: + "@types/node": "*" + checksum: 88505dda8b8e57e1da58ce74fb29bc2b4d64d90e9c34dc1d4b4010116b9785e23ce43f1e8016901bd27037e17d9d148e34d4ebd5f57d060212847e0df91cf024 + languageName: node + linkType: hard + "@types/tern@npm:*": version: 0.23.4 resolution: "@types/tern@npm:0.23.4" @@ -20157,10 +21674,10 @@ __metadata: languageName: node linkType: hard -"cjs-module-lexer@npm:^1.0.0": - version: 1.2.2 - resolution: "cjs-module-lexer@npm:1.2.2" - checksum: 977f3f042bd4f08e368c890d91eecfbc4f91da0bc009a3c557bc4dfbf32022ad1141244ac1178d44de70fc9f3dea7add7cd9a658a34b9fae98a55d8f92331ce5 +"cjs-module-lexer@npm:^1.0.0, cjs-module-lexer@npm:^1.2.2": + version: 1.3.1 + resolution: "cjs-module-lexer@npm:1.3.1" + checksum: 75f20ac264a397ea5c63f9c2343a51ab878043666468f275e94862f7180ec1d764a400ec0c09085dcf0db3193c74a8b571519abd2bf4be0d2be510d1377c8d4b languageName: node linkType: hard @@ -24223,9 +25740,6 @@ __metadata: "@backstage/plugin-techdocs-backend": "workspace:^" "@gitbeaker/node": ^35.1.0 "@octokit/rest": ^19.0.3 - "@opentelemetry/api": ^1.4.1 - "@opentelemetry/exporter-prometheus": ^0.50.0 - "@opentelemetry/sdk-metrics": ^1.13.0 "@types/dockerode": ^3.3.0 "@types/express": ^4.17.6 "@types/express-serve-static-core": ^4.17.5 @@ -24282,6 +25796,9 @@ __metadata: "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-signals-backend": "workspace:^" "@backstage/plugin-techdocs-backend": "workspace:^" + "@opentelemetry/auto-instrumentations-node": ^0.43.0 + "@opentelemetry/exporter-prometheus": ^0.50.0 + "@opentelemetry/sdk-node": ^0.50.0 languageName: unknown linkType: soft @@ -25483,7 +27000,7 @@ __metadata: languageName: node linkType: hard -"gcp-metadata@npm:^6.1.0": +"gcp-metadata@npm:^6.0.0, gcp-metadata@npm:^6.1.0": version: 6.1.0 resolution: "gcp-metadata@npm:6.1.0" dependencies: @@ -26955,6 +28472,18 @@ __metadata: languageName: node linkType: hard +"import-in-the-middle@npm:1.7.1": + version: 1.7.1 + resolution: "import-in-the-middle@npm:1.7.1" + dependencies: + acorn: ^8.8.2 + acorn-import-assertions: ^1.9.0 + cjs-module-lexer: ^1.2.2 + module-details-from-path: ^1.0.3 + checksum: 37cc8c75fb7eac60611bafafea7fc60f794d0931fdabcec516c8a26effe69e914b1f7e8116e98549c6fdd1fe88dcaebfdebf35d7f52c761b48b312e40f3bf323 + languageName: node + linkType: hard + "import-lazy@npm:^2.1.0": version: 2.1.0 resolution: "import-lazy@npm:2.1.0" @@ -28750,6 +30279,19 @@ __metadata: languageName: node linkType: hard +"joi@npm:^17.3.0": + version: 17.13.1 + resolution: "joi@npm:17.13.1" + dependencies: + "@hapi/hoek": ^9.3.0 + "@hapi/topo": ^5.1.0 + "@sideway/address": ^4.1.5 + "@sideway/formula": ^3.0.1 + "@sideway/pinpoint": ^2.0.0 + checksum: e755140446a0e0fb679c0f512d20dfe1625691de368abe8069507c9bccae5216b5bb56b5a83100a600808b1753ab44fdfdc9933026268417f84b6e0832a9604e + languageName: node + linkType: hard + "join-component@npm:^1.1.0": version: 1.1.0 resolution: "join-component@npm:1.1.0" @@ -31824,6 +33366,13 @@ __metadata: languageName: node linkType: hard +"module-details-from-path@npm:^1.0.3": + version: 1.0.3 + resolution: "module-details-from-path@npm:1.0.3" + checksum: 378a8a26013889aa3086bfb0776b7860c5bb957336253e1ba5d779c2f239a218930b145ca76e52c1dd7c8079d52b2af64b8eec30822f81ffdb0dfa27d6fe6f33 + languageName: node + linkType: hard + "moo@npm:^0.5.0": version: 0.5.2 resolution: "moo@npm:0.5.2" @@ -34092,7 +35641,7 @@ __metadata: languageName: node linkType: hard -"pg-types@npm:^2.1.0": +"pg-types@npm:^2.1.0, pg-types@npm:^2.2.0": version: 2.2.0 resolution: "pg-types@npm:2.2.0" dependencies: @@ -35242,7 +36791,7 @@ __metadata: languageName: node linkType: hard -"protobufjs@npm:^7.0.0, protobufjs@npm:^7.2.4, protobufjs@npm:^7.2.5, protobufjs@npm:^7.2.6": +"protobufjs@npm:^7.0.0, protobufjs@npm:^7.2.3, protobufjs@npm:^7.2.5, protobufjs@npm:^7.2.6": version: 7.2.6 resolution: "protobufjs@npm:7.2.6" dependencies: @@ -36843,6 +38392,17 @@ __metadata: languageName: node linkType: hard +"require-in-the-middle@npm:^7.1.1": + version: 7.3.0 + resolution: "require-in-the-middle@npm:7.3.0" + dependencies: + debug: ^4.1.1 + module-details-from-path: ^1.0.3 + resolve: ^1.22.1 + checksum: 014ae8aef4a0ed995476d0ba6f7d86afff7114247353894d3b41ef7b0953de03303c30ad127eaac4036eb0c8c862fd247b760e2a6de10ac147712372304e3e73 + languageName: node + linkType: hard + "require-main-filename@npm:^2.0.0": version: 2.0.0 resolution: "require-main-filename@npm:2.0.0" @@ -37720,7 +39280,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.4.0, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.4.0, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": version: 7.6.0 resolution: "semver@npm:7.6.0" dependencies: @@ -37993,6 +39553,13 @@ __metadata: languageName: node linkType: hard +"shimmer@npm:^1.2.1": + version: 1.2.1 + resolution: "shimmer@npm:1.2.1" + checksum: aa0d6252ad1c682a4fdfda69e541be987f7a265ac7b00b1208e5e48cc68dc55f293955346ea4c71a169b7324b82c70f8400b3d3d2d60b2a7519f0a3522423250 + languageName: node + linkType: hard + "short-unique-id@npm:^5.0.2": version: 5.0.3 resolution: "short-unique-id@npm:5.0.3" From dff1455416d1b2b113b325afe7e6a1ee7af91e41 Mon Sep 17 00:00:00 2001 From: Santosh Bharadwaj Rangavajjula Date: Tue, 7 May 2024 11:03:15 +0200 Subject: [PATCH 124/136] Update ADOPTERS.md Added Scania into adopters list Signed-off-by: Santosh Bharadwaj Rangavajjula --- ADOPTERS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ADOPTERS.md b/ADOPTERS.md index 3878563683..2a5c587270 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -268,3 +268,5 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Aurora Innovation](https://aurorainnovation.com) | [@O5ten](https://github.com/O5ten) | Heavy usage of scaffolder, techdocs, homepage, k8s plugin and homegrown plugins to track migration paths and so on within a developer portal. It acts as a starting point for new and old developers to find all of our internal tooling in one place. | [ENSEK](https://ensek.com/) | [Timothy Deakin](https://github.com/cftad) |We are using Backstage as our internal developer portal to provide a single pane of glass for our developers to access all the tools and services they need to build and maintain our software. | | [OP Financial Group](https://www.op.fi/op-financial-group) | [Heikki Hellgren](https://github.com/drodil), [Jyrki Koistinen](https://github.com/snyvision) | We are using Backstage as a gateway into our internal development platform offering to simplify complexity. | +| [Scania](https://www.scania.com) | [Santosh Rangavajjula](https://linkedin.com/in/rsbth) | We are implementing backstage at Scania to consolidate operational information from Gitlab, Jira, Confluence, Artifactory, Servicenow and other tools into one place. | + From 9cdcf52c249d57e24307773162e84e4941b1126a Mon Sep 17 00:00:00 2001 From: Shaked Braimok Yosef Date: Tue, 7 May 2024 12:20:21 +0300 Subject: [PATCH 125/136] Update ADOPTERS.md Signed-off-by: Shaked Braimok Yosef --- ADOPTERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ADOPTERS.md b/ADOPTERS.md index 3878563683..7c4d3566a5 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -268,3 +268,4 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Aurora Innovation](https://aurorainnovation.com) | [@O5ten](https://github.com/O5ten) | Heavy usage of scaffolder, techdocs, homepage, k8s plugin and homegrown plugins to track migration paths and so on within a developer portal. It acts as a starting point for new and old developers to find all of our internal tooling in one place. | [ENSEK](https://ensek.com/) | [Timothy Deakin](https://github.com/cftad) |We are using Backstage as our internal developer portal to provide a single pane of glass for our developers to access all the tools and services they need to build and maintain our software. | | [OP Financial Group](https://www.op.fi/op-financial-group) | [Heikki Hellgren](https://github.com/drodil), [Jyrki Koistinen](https://github.com/snyvision) | We are using Backstage as a gateway into our internal development platform offering to simplify complexity. | +| [Senora.dev](https://senora.dev) | [Shaked Braimok Yosef](https://github.com/ShakedBraimok) | We are using Backstage as a service catalog for our costumers. | From 3d871b99f9ac7668c37bd8e5c84926afd923972d Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 May 2024 11:23:14 +0200 Subject: [PATCH 126/136] chore: move to private method over gettter Signed-off-by: blam --- plugins/scaffolder-backend/api-report.md | 2 -- .../src/scaffolder/tasks/StorageTaskBroker.ts | 22 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 0c01fd6a9e..8caa0ab0d4 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -572,8 +572,6 @@ export class TaskManager implements TaskContext_2 { // (undocumented) getWorkspaceName(): Promise; // (undocumented) - get isWorkspaceSerializationEnabled(): boolean; - // (undocumented) rehydrateWorkspace?(options: { taskId: string; targetPath: string; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index 9f8f7df241..03a2833938 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -88,14 +88,6 @@ export class TaskManager implements TaskContext { private readonly config?: Config, ) {} - get isWorkspaceSerializationEnabled(): boolean { - return ( - this.config?.getOptionalBoolean( - 'scaffolder.EXPERIMENTAL_workspaceSerialization', - ) ?? false - ); - } - get spec() { return this.task.spec; } @@ -120,7 +112,7 @@ export class TaskManager implements TaskContext { taskId: string; targetPath: string; }): Promise { - if (this.isWorkspaceSerializationEnabled) { + if (this.isWorkspaceSerializationEnabled()) { this.storage.rehydrateWorkspace?.(options); } } @@ -171,7 +163,7 @@ export class TaskManager implements TaskContext { } async serializeWorkspace?(options: { path: string }): Promise { - if (this.isWorkspaceSerializationEnabled) { + if (this.isWorkspaceSerializationEnabled()) { await this.storage.serializeWorkspace?.({ path: options.path, taskId: this.task.taskId, @@ -180,7 +172,7 @@ export class TaskManager implements TaskContext { } async cleanWorkspace?(): Promise { - if (this.isWorkspaceSerializationEnabled) { + if (this.isWorkspaceSerializationEnabled()) { await this.storage.cleanWorkspace?.({ taskId: this.task.taskId }); } } @@ -219,6 +211,14 @@ export class TaskManager implements TaskContext { }, 1000); } + private isWorkspaceSerializationEnabled(): boolean { + return ( + this.config?.getOptionalBoolean( + 'scaffolder.EXPERIMENTAL_workspaceSerialization', + ) ?? false + ); + } + async getInitiatorCredentials(): Promise { const secrets = this.task.secrets as InternalTaskSecrets; From a4b399f18036011122538dac1008a7c2ca3092d3 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 7 May 2024 11:27:54 +0200 Subject: [PATCH 127/136] docs: remove developer journey Signed-off-by: Patrik Oldsberg --- docs/tutorials/journey.md | 271 -------------------------------------- microsite/sidebars.json | 1 - mkdocs.yml | 1 - 3 files changed, 273 deletions(-) delete mode 100644 docs/tutorials/journey.md diff --git a/docs/tutorials/journey.md b/docs/tutorials/journey.md deleted file mode 100644 index af78cbe597..0000000000 --- a/docs/tutorials/journey.md +++ /dev/null @@ -1,271 +0,0 @@ ---- -id: journey -title: Future developer journey -description: This document describes a possible journey of a future Backstage ---- - -> This document describes a possible journey of a **_future_** Backstage plugin -> developer as they build a plugin that touches many different aspects of a -> Backstage. The story invents many new things that are not part of Backstage -> today, but are things that I'm suggesting we should add as long term or north -> star goals. The idea is to discuss what parts of the story makes sense to aim -> for, and what we'd want to do differently or not at all. The "chapters" are -> numbered to make it a bit easier to comment on parts of the story. - -# The Protagonist - -Sam is an experienced developer that has worked with Backstage for a while, and -knows the best practices and tools available to build plugins. Sam also likes -music and wants to have a theme tune for every service in Backstage. - -# The End - -Sam built a Spotify plugin for Backstage that allows service owners to define a -theme tune for their service. The theme tune plays whenever a user visits the -service page in Backstage. The plugin is published to npm and available for any -organization to easily install and add to their Backstage installation. - -# 1. A New Plugin - -Sam chooses to develop this plugin in a standalone project and creates a new -plugin using `npx @backstage/cli new --select plugin`, which detects that it's not -being run in an existing project and therefore creates a separate plugin repo. - -Spinning up the frontend with `yarn start`, Sam goes to work with getting the -base functionality of a Spotify web player going. By installing a couple of -dependencies and whipping together a nice UI, the player is pretty much done. - -# 2. The Auth Menace - -Sam realizes users need to be authenticated towards the Spotify API to be able -to play music, and Backstage doesn't support Spotify login yet. Sam adds the -`@backstage/plugin-auth-backend` as local development middleware in the project, -and provides the necessary wrapping logic and configuration for the -`passport-spotify` strategy. The Spotify auth provider is now available in the -local development backend, and by adding a frontend `SpotifyAuth` Utility API -that implements the `OAuthApi` type, it's now working in the frontend too. - -```ts -const spotifyAuthApiRef = createApiRef({ - id: 'core.auth.spotify', -}); -``` - -Sam realizes that Spotify auth might be useful to others, and that it would be -more convenient if it was a part of the Backstage Core. After submitting and -merging a Pull Request with the additions to the -`@backstage/plugin-auth-backend` and `@backstage/core-plugin-api` packages, -Spotify auth is now available for everyone to use. Since the Backstage Core team -also adds it to the public demo server, Sam can now get rid of it in the local -setup and rely on the shared development auth providers instead. - -The only thing left now is making sure that users of the plugin provide Spotify -auth in the app. Sam ensures this by adding `spotifyAuthApiRef` to the plugin's -list of required APIs, as well as listing it in the requirements section in the -README. - -```md -## Requirements - -This plugin requires the following APIs to function: - -- `spotifyAuthApiRef` from `@@backstage/core-plugin-api@^1.1.0` -``` - -# 3. The Catalog Awakens - -Sam now has a working player and a method for users to log in to listen to -music, but the goal is to provide theme songs for services. Sam adds this -functionality by defining a new metadata annotation called -`sam.wise/spotify-track-id`. The annotation's value is a Spotify track ID and -can be defined in a component like this: - -```yaml -apiVersion: backstage.io/v1 -kind: Component -metadata: - name: my-component - annotations: - sam.wise/spotify-track-id: '4uLU6hMCjMI75M1A2tKUQC' -spec: - type: service -``` - -Sam creates a JSON schema that documents the annotation and allows it to be used -in validation and documentation for organizations that choose to adopt the -plugin. - -```json -{ - "sam.wise/spotify-track-id": { - "$id": "https://raw.githubusercontent.com/sam/backstage-spotify-theme/master/annotation.json#/sam.wise/spotify-track-id", - "type": "string", - "title": "Spotify Track Annotation", - "description": "Spotify track ID to associated with the entity", - "examples": ["4uLU6hMCjMI75M1A2tKUQC"] - } -} -``` - -# 4. The Rise of Widgets - -Sam also wraps the music player in an entity page widget. This allows anyone -that wants to use the plugin to add the player to any of their entity layout -templates, which will make it show up for every entity of that kind. - -```tsx -export const PlayerWidget = plugin.createEntityWidget({ - component: WebPlayer, - locations: ['header', 'card', 'footer'], - cardSize: [2, 4], -}); -``` - -The widget receives information about the entity in whose page it's being -embedded, which makes it simple to grab the track id from the annotations and -hook up the player. - -Sam also modifies the standalone plugin development setup to include this new -widget inside a basic entity page, adding it to a couple of different places -where users of the plugin may want to put the player, just to make sure they all -work. - -# 5. The First User - -At this point the only things that anyone that wants to use Sam's plugin needs -to do are to add -https://raw.githubusercontent.com/sam/backstage-spotify-theme/master/annotation.json#/sam.wise/spotify-track-id -to their catalog schema, import and add the `PlayerWidget` on the desired entity -template pages, and make sure they're providing Spotify auth. - -Sam soon sees the first "Used by" show up on GitHub, and feedback starts rolling -in. Users really like the plugin, and some a requesting the possibility to -select a theme tune when creating a new component. Sam jumps on the idea and -adds a new creation hook that is exported by the plugin. The hook can be -installed either in a single, all, or component templates that match a label. It -adds a field as a part of the component creation process with a nice search box -that allows users to search for a track that they want to use as the theme tune. - -# 6. Return to the Repo - -Sam is pretty content at this point, but would like to make it easier for users -to change the track after creation, preferable using the same search box that -was made for the creation form. By adding an edit button to the `PlayerWidget`, -and a nice empty state, Sam is able to provide the appropriate hooks in the GUI -to open up a search dialog. - -To save the selected track, Sam uses the `RepoApi` to suggest a change to the -entity definition file. This will create a Pull Request for organizations that -use GitHub, a Merge Request for users of GitLab, and so on. - -```ts -const repoApi = useApi(repoApiRef); -const alertApi = useApi(alertApiRef); - -const onSave = async () => { - const { url } = await repoApi.createChangeRequest({ - title: `Change theme tune to ${track.title} by ${track.artist}`, - changes: [ - { - path: entityYamlPath, - content: newEntityYamlContent, - }, - ], - }); - - alertApi.post({ message: `Requested change, ${url}` }); -}; -``` - -Now it's much simpler for users to change the theme tune, as they no longer need -to go look up a track ID and edit a YAML file. Instead, they can now stay inside -Backstage and search for the track and request the change from there. In -addition, the requested change can be reviewed by the regular process of each -organization. - -# 7. The User Strikes Back - -Sam's plugin is pretty popular at this point, and has been picked up and used by -many organizations. But some users start voicing concerns that they have too -many different hand-crafted annotations in their entity descriptions, and would -like to be able to avoid some of them. They really like the theme tunes though, -and wish they could keep them without having to put them in the entity -description, even if that means it won't go through the regular source control -review process. - -One day Sam receives a Pull Request for the plugin. It adds an option to use the -Database provided by `@backstage/backend-common` to store the track ID. It's all -packaged into a new backend plugin that will also extend the catalog backend -with schema and functionality to automatically load the value of the -`sam.wise/spotify-track-id` annotation from the backend plugin and database. The -backend plugin also extends the common GraphQL schema with a mutation that -updates the track ID in the database. - -On the frontend the Pull Request doesn't change much. It defines the save action -the was previously using the `RepoApi` in its own API. - -```ts -type ThemeTuneStorageApi = { - save(entity: Entity, trackId: string): Promise; -}; -``` - -The plugin also provides two different implementations of the API, one that uses -the old behavior of the `RepoApi`, and a new one that calls the `GraphQL` API. -The new API relies on the `IdentityApi` as a mechanism for authorizing changes, -instead of source control reviews. The `IdentityApi` provides a token that is -included in the request to the backend, which then must match the owner of the -component for which the user is trying to change the theme tune. - -> Author breaking the 4th wall here. I actually think every GraphQL request -> should include the ID token of the user, but invented a reason to include it -> here anyway. - -The API is selected based on a configuration parameter for the plugin, but -defaults to the original `RepoApi` behavior. - -```ts -if (config.getBoolean('storeTrackInDatabase')) { - return new GraphQLThemeTuneStore(graphqlClient, identityApi, alertApi); -} else { - return new RepoThemeTuneStore(repoApi, alertApi); -} -``` - -Sam is amazed by the pure awesomeness of this change, replies with a "👍" and -hits merge. - -# 8. Attack of the Clones - -Sam just released v1.8.4 of the plugin, and at this point it's so popular that a -couple of other plugins have started depending on the -`sam.wise/spotify-track-id` annotation. One such plugin being the -`spotify-album-art` plugin that can display the album art of the theme tune as -the background of the entity header. Sam thinks it's all pretty cool, but -doesn't like that the annotation that was once an internal concern of the plugin -is now becoming a standard in the community. - -In order to standardize the annotation in Backstage, Sam submits a Pull Request -to the Backstage Core repo. The request suggests a new well-known metadata -annotation called `spotify.com/track-id`, with the same schema definition as -Sam's label, and refers to Sam's own plugin and the `spotify-album-art` plugin -as existing usages. The Backstage maintainers merge the Pull Request, after -checking with the folks over at Spotify that they're cool with the annotation, -and faffing about over some minor grammar mistake in the annotation description. - -With the annotation now available inside Backstage Core, Sam releases v2 of the -plugin, which uses the new annotation. It can still consume the old annotation -for backwards compatibility, but new users of the plugin no longer need to add -the -https://raw.githubusercontent.com/sam/backstage-spotify-theme/master/annotation.json#/sam.wise/spotify-track-id -extension to their catalog schema, as it's now part of the core schema. The new -release of Sam's plugin specifies a dependency on Backstage with a minimum -version set to the same release as the one were the annotation was added to the -core schema. - -# 9. Revenge of the Sam - -Sam, now in full control of all theme tunes in Backstage, releases v2.0.1, which -switches all tracks to 4uLU6hMCjMI75M1A2tKUQC. Sam wanted to do something more -nefarious, but since Backstage sandboxes sensitive actions and is mostly -read-only with strict CSP, Sam's hands were tied. diff --git a/microsite/sidebars.json b/microsite/sidebars.json index eadcbbf806..6d9ba3a680 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -498,7 +498,6 @@ "api/deprecations" ], "Tutorials": [ - "tutorials/journey", "tutorials/quickstart-app-plugin", "tutorials/react-router-stable-migration", "tutorials/react18-migration", diff --git a/mkdocs.yml b/mkdocs.yml index 7ba6fdfefa..66ce7d8def 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -195,7 +195,6 @@ nav: - Utility APIs: 'api/utility-apis.md' - Deprecations: 'api/deprecations.md' - Tutorials: - - Future developer journey: 'tutorials/journey.md' - React Router 6.0 Migration: 'tutorials/react-router-stable-migration.md' - Package Role Migration: 'tutorials/package-role-migration.md' - Migrating away from @backstage/core: 'tutorials/migrating-away-from-core.md' From 845d56a76fe9e2131aaaf8221b438204976c1dbd Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Thu, 2 May 2024 09:59:37 +0300 Subject: [PATCH 128/136] feat: improve signal lifecycle management + server side pinging Signed-off-by: Heikki Hellgren --- .changeset/healthy-shirts-roll.md | 5 ++ .../backend-legacy/src/plugins/signals.ts | 1 + plugins/signals-backend/api-report.md | 6 ++ plugins/signals-backend/package.json | 3 +- plugins/signals-backend/src/plugin.ts | 6 ++ .../src/service/SignalManager.test.ts | 20 +++++++ .../src/service/SignalManager.ts | 60 +++++++++++++++++-- .../src/service/router.test.ts | 2 + plugins/signals-backend/src/service/router.ts | 26 ++++---- yarn.lock | 11 ++-- 10 files changed, 119 insertions(+), 21 deletions(-) create mode 100644 .changeset/healthy-shirts-roll.md diff --git a/.changeset/healthy-shirts-roll.md b/.changeset/healthy-shirts-roll.md new file mode 100644 index 0000000000..aec74a1181 --- /dev/null +++ b/.changeset/healthy-shirts-roll.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-signals-backend': patch +--- + +Improved signal lifecycle management and added server side pinging of connections diff --git a/packages/backend-legacy/src/plugins/signals.ts b/packages/backend-legacy/src/plugins/signals.ts index d97d3fc170..33b1af5edf 100644 --- a/packages/backend-legacy/src/plugins/signals.ts +++ b/packages/backend-legacy/src/plugins/signals.ts @@ -25,5 +25,6 @@ export default async function createPlugin( events: env.events, identity: env.identity, discovery: env.discovery, + config: env.config, }); } diff --git a/plugins/signals-backend/api-report.md b/plugins/signals-backend/api-report.md index cad43bfaae..d59ca8e5ad 100644 --- a/plugins/signals-backend/api-report.md +++ b/plugins/signals-backend/api-report.md @@ -5,9 +5,11 @@ ```ts import { AuthService } from '@backstage/backend-plugin-api'; import { BackendFeature } from '@backstage/backend-plugin-api'; +import { Config } from '@backstage/config'; import { EventsService } from '@backstage/plugin-events-node'; import express from 'express'; import { IdentityApi } from '@backstage/plugin-auth-node'; +import { LifecycleService } from '@backstage/backend-plugin-api'; import { LoggerService } from '@backstage/backend-plugin-api'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { UserInfoService } from '@backstage/backend-plugin-api'; @@ -20,12 +22,16 @@ export interface RouterOptions { // (undocumented) auth?: AuthService; // (undocumented) + config: Config; + // (undocumented) discovery: PluginEndpointDiscovery; // (undocumented) events: EventsService; // (undocumented) identity: IdentityApi; // (undocumented) + lifecycle?: LifecycleService; + // (undocumented) logger: LoggerService; // (undocumented) userInfo?: UserInfoService; diff --git a/plugins/signals-backend/package.json b/plugins/signals-backend/package.json index 5d961c71ef..24561caf46 100644 --- a/plugins/signals-backend/package.json +++ b/plugins/signals-backend/package.json @@ -41,7 +41,7 @@ "node-fetch": "^2.6.7", "uuid": "^9.0.0", "winston": "^3.2.1", - "ws": "^8.14.2", + "ws": "^8.17.0", "yn": "^4.0.0" }, "devDependencies": { @@ -51,6 +51,7 @@ "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^", "@backstage/plugin-events-backend": "workspace:^", "@types/supertest": "^2.0.8", + "@types/ws": "^8.5.10", "msw": "^1.0.0", "supertest": "^6.2.4" }, diff --git a/plugins/signals-backend/src/plugin.ts b/plugins/signals-backend/src/plugin.ts index 3e00c00a34..0963b79ccb 100644 --- a/plugins/signals-backend/src/plugin.ts +++ b/plugins/signals-backend/src/plugin.ts @@ -32,6 +32,8 @@ export const signalsPlugin = createBackendPlugin({ deps: { httpRouter: coreServices.httpRouter, logger: coreServices.logger, + config: coreServices.rootConfig, + lifecycle: coreServices.rootLifecycle, identity: coreServices.identity, discovery: coreServices.discovery, userInfo: coreServices.userInfo, @@ -41,6 +43,8 @@ export const signalsPlugin = createBackendPlugin({ async init({ httpRouter, logger, + config, + lifecycle, identity, discovery, userInfo, @@ -50,7 +54,9 @@ export const signalsPlugin = createBackendPlugin({ httpRouter.use( await createRouter({ logger, + config, identity, + lifecycle, discovery, userInfo, auth, diff --git a/plugins/signals-backend/src/service/SignalManager.test.ts b/plugins/signals-backend/src/service/SignalManager.test.ts index 3ee99bb34b..7d3a6ddf59 100644 --- a/plugins/signals-backend/src/service/SignalManager.test.ts +++ b/plugins/signals-backend/src/service/SignalManager.test.ts @@ -17,6 +17,7 @@ import { WebSocket } from 'ws'; import { EventsServiceSubscribeOptions } from '@backstage/plugin-events-node'; import { SignalManager } from './SignalManager'; import { getVoidLogger } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; class MockWebSocket { closed: boolean = false; @@ -30,6 +31,11 @@ class MockWebSocket { this.closed = true; } + terminate(): void { + this.readyState = WebSocket.CLOSED; + this.closed = true; + } + on( event: string | symbol, listener: (this: WebSocket, ...args: any[]) => void, @@ -63,9 +69,23 @@ describe('SignalManager', () => { }, }; + const shutdownHooks: Function[] = []; + const mockLifecycle = { + addShutdownHook: (hook: Function) => shutdownHooks.push(hook), + }; + const manager = SignalManager.create({ events: mockEvents, logger: getVoidLogger(), + config: new ConfigReader({}), + lifecycle: mockLifecycle as any, + }); + + it('should close all connections when server is closed', () => { + const ws = new MockWebSocket(); + manager.addConnection(ws as unknown as WebSocket); + shutdownHooks.forEach(hook => hook()); + expect(ws.closed).toBeTruthy(); }); it('should close connection on error', () => { diff --git a/plugins/signals-backend/src/service/SignalManager.ts b/plugins/signals-backend/src/service/SignalManager.ts index 3211c51c9c..995c80ad28 100644 --- a/plugins/signals-backend/src/service/SignalManager.ts +++ b/plugins/signals-backend/src/service/SignalManager.ts @@ -20,8 +20,10 @@ import { v4 as uuid } from 'uuid'; import { JsonObject } from '@backstage/types'; import { BackstageUserInfo, + LifecycleService, LoggerService, } from '@backstage/backend-plugin-api'; +import { Config } from '@backstage/config'; /** * @internal @@ -32,6 +34,7 @@ export type SignalConnection = { ws: WebSocket; ownershipEntityRefs: string[]; subscriptions: Set; + isAlive: boolean; }; /** @@ -39,7 +42,9 @@ export type SignalConnection = { */ export type SignalManagerOptions = { events: EventsService; + config: Config; logger: LoggerService; + lifecycle?: LifecycleService; }; /** @internal */ @@ -50,6 +55,7 @@ export class SignalManager { >(); private events: EventsService; private logger: LoggerService; + private pingInterval: ReturnType | undefined; static create(options: SignalManagerOptions) { return new SignalManager(options); @@ -64,11 +70,43 @@ export class SignalManager { onEvent: (params: EventParams) => this.onEventBrokerEvent(params.eventPayload as SignalPayload), }); + + options.lifecycle?.addShutdownHook(() => this.onShutdown()); + } + + private ping() { + this.connections.forEach(conn => { + if (!conn.isAlive) { + this.logger.debug(`Connection ${conn.id} is not alive, terminating`); + conn.ws.terminate(); + return; + } + + conn.isAlive = false; + conn.ws.ping(); + }); + } + + private onShutdown() { + if (this.pingInterval) { + clearInterval(this.pingInterval); + } + + // TODO: Unsubscribe from events? + + this.connections.forEach(conn => { + conn.ws.terminate(); + }); + this.connections.clear(); } addConnection(ws: WebSocket, identity?: BackstageUserInfo) { - const id = uuid(); + // Start pinging on first connection + if (!this.pingInterval) { + this.pingInterval = setInterval(() => this.ping(), 30000); + } + const id = uuid(); const conn = { id, user: identity?.userEntityRef ?? 'user:default/guest', @@ -77,25 +115,37 @@ export class SignalManager { 'user:default/guest', ], subscriptions: new Set(), + isAlive: true, }; this.connections.set(id, conn); + this.logger.debug(`Connection ${id} connected`); ws.on('error', (err: Error) => { this.logger.error( `Error occurred with connection ${id}: ${err}, closing connection`, ); - ws.close(); + ws.terminate(); this.connections.delete(id); }); ws.on('close', (code: number, reason: Buffer) => { - this.logger.info( + this.logger.debug( `Connection ${id} closed with code ${code}, reason: ${reason}`, ); + ws.terminate(); this.connections.delete(id); }); + ws.on('ping', () => { + conn.isAlive = true; + ws.pong(); + }); + + ws.on('pong', () => { + conn.isAlive = true; + }); + ws.on('message', (data: RawData, isBinary: boolean) => { this.logger.debug(`Received message from connection ${id}: ${data}`); if (isBinary) { @@ -114,12 +164,12 @@ export class SignalManager { private handleMessage(connection: SignalConnection, message: JsonObject) { if (message.action === 'subscribe' && message.channel) { - this.logger.info( + this.logger.debug( `Connection ${connection.id} subscribed to ${message.channel}`, ); connection.subscriptions.add(message.channel as string); } else if (message.action === 'unsubscribe' && message.channel) { - this.logger.info( + this.logger.debug( `Connection ${connection.id} unsubscribed from ${message.channel}`, ); connection.subscriptions.delete(message.channel as string); diff --git a/plugins/signals-backend/src/service/router.test.ts b/plugins/signals-backend/src/service/router.test.ts index bbcf506d19..c081031c54 100644 --- a/plugins/signals-backend/src/service/router.test.ts +++ b/plugins/signals-backend/src/service/router.test.ts @@ -24,6 +24,7 @@ import { createRouter } from './router'; import { EventsService } from '@backstage/plugin-events-node'; import { IdentityApi } from '@backstage/plugin-auth-node'; import { UserInfoService } from '@backstage/backend-plugin-api'; +import { ConfigReader } from '@backstage/config'; const eventsServiceMock: jest.Mocked = { subscribe: jest.fn(), @@ -53,6 +54,7 @@ describe('createRouter', () => { events: eventsServiceMock, discovery, userInfo, + config: new ConfigReader({}), }); app = express().use(router); }); diff --git a/plugins/signals-backend/src/service/router.ts b/plugins/signals-backend/src/service/router.ts index fab706e878..ea706ebf1a 100644 --- a/plugins/signals-backend/src/service/router.ts +++ b/plugins/signals-backend/src/service/router.ts @@ -23,6 +23,7 @@ import Router from 'express-promise-router'; import { AuthService, BackstageUserInfo, + LifecycleService, LoggerService, UserInfoService, } from '@backstage/backend-plugin-api'; @@ -33,6 +34,7 @@ import { IdentityApi } from '@backstage/plugin-auth-node'; import { EventsService } from '@backstage/plugin-events-node'; import { WebSocket, WebSocketServer } from 'ws'; import { Duplex } from 'stream'; +import { Config } from '@backstage/config'; /** @public */ export interface RouterOptions { @@ -40,6 +42,8 @@ export interface RouterOptions { events: EventsService; identity: IdentityApi; discovery: PluginEndpointDiscovery; + config: Config; + lifecycle?: LifecycleService; auth?: AuthService; userInfo?: UserInfoService; } @@ -56,16 +60,12 @@ export async function createRouter( let apiUrl: string | undefined = undefined; const webSocketServer = new WebSocketServer({ - noServer: true, - clientTracking: false, + noServer: true, // handle upgrade manually + clientTracking: false, // handle connections in SignalManager }); webSocketServer.on('error', (error: Error) => { - logger.error('WebSocket server error', error); - }); - - webSocketServer.on('close', () => { - logger.info('WebSocket server closed'); + logger.error(`WebSocket server error: ${error}`); }); const handleUpgrade = async ( @@ -94,7 +94,7 @@ export async function createRouter( } } } catch (e) { - logger.error('Failed to authenticate WebSocket connection', e); + logger.error(`Failed to authenticate WebSocket connection: ${e}`); socket.write( 'HTTP/1.1 401 Web Socket Protocol Handshake\r\n' + 'Upgrade: WebSocket\r\n' + @@ -115,7 +115,14 @@ export async function createRouter( }, ); } catch (e) { - logger.error('Failed to handle WebSocket upgrade', e); + logger.error(`Failed to handle WebSocket upgrade: ${e}`); + socket.write( + 'HTTP/1.1 500 Web Socket Protocol Handshake\r\n' + + 'Upgrade: WebSocket\r\n' + + 'Connection: Upgrade\r\n' + + '\r\n', + ); + socket.destroy(); } }; @@ -145,7 +152,6 @@ export async function createRouter( router.use(upgradeMiddleware); router.get('/health', (_, response) => { - logger.info('PONG!'); response.json({ status: 'ok' }); }); diff --git a/yarn.lock b/yarn.lock index 89d4b0ee45..f541bd1702 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7271,6 +7271,7 @@ __metadata: "@backstage/types": "workspace:^" "@types/express": "*" "@types/supertest": ^2.0.8 + "@types/ws": ^8.5.10 express: ^4.17.1 express-promise-router: ^4.1.0 http-proxy-middleware: ^2.0.0 @@ -7279,7 +7280,7 @@ __metadata: supertest: ^6.2.4 uuid: ^9.0.0 winston: ^3.2.1 - ws: ^8.14.2 + ws: ^8.17.0 yn: ^4.0.0 languageName: unknown linkType: soft @@ -42139,9 +42140,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:*, ws@npm:^8.11.0, ws@npm:^8.12.0, ws@npm:^8.13.0, ws@npm:^8.14.2, ws@npm:^8.16.0, ws@npm:^8.8.0": - version: 8.16.0 - resolution: "ws@npm:8.16.0" +"ws@npm:*, ws@npm:^8.11.0, ws@npm:^8.12.0, ws@npm:^8.13.0, ws@npm:^8.14.2, ws@npm:^8.16.0, ws@npm:^8.17.0, ws@npm:^8.8.0": + version: 8.17.0 + resolution: "ws@npm:8.17.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -42150,7 +42151,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: feb3eecd2bae82fa8a8beef800290ce437d8b8063bdc69712725f21aef77c49cb2ff45c6e5e7fce622248f9c7abaee506bae0a9064067ffd6935460c7357321b + checksum: 147ef9eab0251364e1d2c55338ad0efb15e6913923ccbfdf20f7a8a6cb8f88432bcd7f4d8f66977135bfad35575644f9983201c1a361019594a4e53977bf6d4e languageName: node linkType: hard From c6113b5e787a569736dc82394debe756f84db2a0 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 May 2024 11:46:35 +0200 Subject: [PATCH 129/136] chore: added api-reports Signed-off-by: blam --- packages/backend-test-utils/api-report.md | 10 ++++++++++ plugins/events-node/api-report.md | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index ff3f50ef8c..4f6eb47243 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -17,6 +17,7 @@ import { BackstageUserPrincipal } from '@backstage/backend-plugin-api'; import { CacheService } from '@backstage/backend-plugin-api'; import { DatabaseService } from '@backstage/backend-plugin-api'; import { DiscoveryService } from '@backstage/backend-plugin-api'; +import { EventsService } from '@backstage/plugin-events-node'; import { ExtendedHttpServer } from '@backstage/backend-app-api'; import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { HttpAuthService } from '@backstage/backend-plugin-api'; @@ -183,6 +184,15 @@ export namespace mockServices { partialImpl?: Partial | undefined, ) => ServiceMock; } + // (undocumented) + export namespace events { + const // (undocumented) + factory: () => ServiceFactory; + const // (undocumented) + mock: ( + partialImpl?: Partial | undefined, + ) => ServiceMock; + } export function httpAuth(options?: { pluginId?: string; defaultCredentials?: BackstageCredentials; diff --git a/plugins/events-node/api-report.md b/plugins/events-node/api-report.md index 9574d6c098..46646d2ce8 100644 --- a/plugins/events-node/api-report.md +++ b/plugins/events-node/api-report.md @@ -4,6 +4,7 @@ ```ts import { LoggerService } from '@backstage/backend-plugin-api'; +import { ServiceFactory } from '@backstage/backend-plugin-api'; import { ServiceRef } from '@backstage/backend-plugin-api'; // @public @@ -61,6 +62,12 @@ export interface EventsService { // @public (undocumented) export type EventsServiceEventHandler = (params: EventParams) => Promise; +// @public (undocumented) +export const eventsServiceFactory: () => ServiceFactory< + EventsService, + 'plugin' +>; + // @public export const eventsServiceRef: ServiceRef; From 63ecf044b3d1d447095ed45d78130d5e3750688b Mon Sep 17 00:00:00 2001 From: Ruslan Gaiazov <44463016+freeyoungstrong@users.noreply.github.com> Date: Tue, 7 May 2024 13:10:28 +0200 Subject: [PATCH 130/136] Update analytics.md Updated links to analytics plugins that were moved to the new repository community-plugins Signed-off-by: Ruslan Gaiazov <44463016+freeyoungstrong@users.noreply.github.com> --- docs/plugins/analytics.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/plugins/analytics.md b/docs/plugins/analytics.md index 6b1f0a8254..52a859b5e9 100644 --- a/docs/plugins/analytics.md +++ b/docs/plugins/analytics.md @@ -46,9 +46,9 @@ To suggest an integration, please [open an issue][add-tool] for the analytics tool your organization uses. Or jump to [Writing Integrations][int-howto] to learn how to contribute the integration yourself! -[ga]: https://github.com/backstage/backstage/blob/master/plugins/analytics-module-ga/README.md -[ga4]: https://github.com/backstage/backstage/blob/master/plugins/analytics-module-ga4/README.md -[newrelic-browser]: https://github.com/backstage/backstage/blob/master/plugins/analytics-module-newrelic-browser/README.md +[ga]: https://github.com/backstage/community-plugins/blob/main/workspaces/analytics/plugins/analytics-module-ga/README.md +[ga4]: https://github.com/backstage/community-plugins/blob/main/workspaces/analytics/plugins/analytics-module-ga4/README.md +[newrelic-browser]: https://github.com/backstage/community-plugins/blob/main/workspaces/analytics/plugins/analytics-module-newrelic-browser/README.md [qm]: https://github.com/quantummetric/analytics-module-qm/blob/main/README.md [matomo]: https://github.com/janus-idp/backstage-plugins/blob/main/plugins/analytics-module-matomo/README.md [add-tool]: https://github.com/backstage/backstage/issues/new?assignees=&labels=plugin&template=plugin_template.md&title=%5BAnalytics+Module%5D+THE+ANALYTICS+TOOL+TO+INTEGRATE From 178ffdd402409a308eb9222918ad75c25ec4b1fb Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Tue, 7 May 2024 14:25:39 +0200 Subject: [PATCH 131/136] techdocs-cli-embedded-app: default techdocs.builder to local Signed-off-by: Vincenzo Scamporlino --- packages/techdocs-cli-embedded-app/src/apis.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/techdocs-cli-embedded-app/src/apis.ts b/packages/techdocs-cli-embedded-app/src/apis.ts index d48bee569d..5bb19a563d 100644 --- a/packages/techdocs-cli-embedded-app/src/apis.ts +++ b/packages/techdocs-cli-embedded-app/src/apis.ts @@ -72,7 +72,7 @@ class TechDocsDevStorageApi implements TechDocsStorageApi { } async getBuilder() { - return this.configApi.getString('techdocs.builder'); + return this.configApi.getOptionalString('techdocs.builder') || 'local'; } async getEntityDocs(_entityId: CompoundEntityRef, path: string) { From 8a18e9ef38bcfb390afebfb60c73fa764823e571 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Tue, 7 May 2024 14:28:02 +0200 Subject: [PATCH 132/136] techdocs: make builder optional Signed-off-by: Vincenzo Scamporlino --- plugins/techdocs-backend/config.d.ts | 2 +- .../techdocs-backend/src/service/DefaultDocsBuildStrategy.ts | 4 +++- plugins/techdocs/config.d.ts | 2 +- plugins/techdocs/src/client.ts | 2 +- plugins/techdocs/src/reader/components/TechDocsNotFound.tsx | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/techdocs-backend/config.d.ts b/plugins/techdocs-backend/config.d.ts index 01da1e7926..9d1cd9e170 100644 --- a/plugins/techdocs-backend/config.d.ts +++ b/plugins/techdocs-backend/config.d.ts @@ -24,7 +24,7 @@ export interface Config { * Documentation building process depends on the builder attr * @visibility frontend */ - builder: 'local' | 'external'; + builder?: 'local' | 'external'; /** * Techdocs generator information diff --git a/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.ts b/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.ts index bc2c586c82..a0bd623b64 100644 --- a/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.ts +++ b/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.ts @@ -29,6 +29,8 @@ export class DefaultDocsBuildStrategy implements DocsBuildStrategy { } async shouldBuild(_: { entity: Entity }): Promise { - return this.config.getString('techdocs.builder') === 'local'; + return [undefined, 'local'].includes( + this.config.getOptionalString('techdocs.builder'), + ); } } diff --git a/plugins/techdocs/config.d.ts b/plugins/techdocs/config.d.ts index 82ae8dd87a..0df852e490 100644 --- a/plugins/techdocs/config.d.ts +++ b/plugins/techdocs/config.d.ts @@ -24,7 +24,7 @@ export interface Config { * Documentation building process depends on the builder attr * @visibility frontend */ - builder: 'local' | 'external'; + builder?: 'local' | 'external'; /** * Allows fallback to case-sensitive triplets in case of migration issues. diff --git a/plugins/techdocs/src/client.ts b/plugins/techdocs/src/client.ts index ae81ecdaaa..0f11eb4068 100644 --- a/plugins/techdocs/src/client.ts +++ b/plugins/techdocs/src/client.ts @@ -151,7 +151,7 @@ export class TechDocsStorageClient implements TechDocsStorageApi { } async getBuilder(): Promise { - return this.configApi.getString('techdocs.builder'); + return this.configApi.getOptionalString('techdocs.builder') || 'local'; } /** diff --git a/plugins/techdocs/src/reader/components/TechDocsNotFound.tsx b/plugins/techdocs/src/reader/components/TechDocsNotFound.tsx index bd2ef26b1e..858f9c5afc 100644 --- a/plugins/techdocs/src/reader/components/TechDocsNotFound.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsNotFound.tsx @@ -39,7 +39,7 @@ export const TechDocsNotFound = ({ errorMessage }: Props) => { }, [analyticsApi, entityRef, location]); let additionalInfo = ''; - if (techdocsBuilder !== 'local') { + if (![undefined, 'local'].includes(techdocsBuilder)) { additionalInfo = "Note that techdocs.builder is not set to 'local' in your config, which means this Backstage app will not " + "generate docs if they are not found. Make sure the project's docs are generated and published by some external " + From 5863cf7137cef4f5e28a98b9af668fea8f934bb7 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Tue, 7 May 2024 14:32:17 +0200 Subject: [PATCH 133/136] techdocs: builder changesets Signed-off-by: Vincenzo Scamporlino --- .changeset/metal-years-rhyme.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/metal-years-rhyme.md diff --git a/.changeset/metal-years-rhyme.md b/.changeset/metal-years-rhyme.md new file mode 100644 index 0000000000..9c6daebdac --- /dev/null +++ b/.changeset/metal-years-rhyme.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-techdocs-backend': patch +'@backstage/plugin-techdocs': patch +--- + +The `techdocs.builder` config is now optional and it will default to `local`. From b6d065fe3b742628c7e6c48a1595e8e8389728df Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 May 2024 14:50:50 +0200 Subject: [PATCH 134/136] chore: fixing changeset Signed-off-by: blam --- .changeset/sixty-bears-camp.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/sixty-bears-camp.md b/.changeset/sixty-bears-camp.md index ff6179c06f..f7a11482a7 100644 --- a/.changeset/sixty-bears-camp.md +++ b/.changeset/sixty-bears-camp.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-scaffolder': minor +'@backstage/plugin-scaffolder': patch --- -`MultiEntityPicker` is able to be set as required +Fixed a bug where the `MultiEntityPicker` was not able to be set as required From fcee1ce391f6e21c86602ee24ff1da237a9a133d Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Tue, 7 May 2024 15:04:54 +0200 Subject: [PATCH 135/136] techdocs-backend: fix build strategy tests Signed-off-by: Vincenzo Scamporlino --- .../service/DefaultDocsBuildStrategy.test.ts | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.test.ts b/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.test.ts index 7868135b08..714a3736a9 100644 --- a/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.test.ts +++ b/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.test.ts @@ -17,12 +17,6 @@ import { DefaultDocsBuildStrategy } from './DefaultDocsBuildStrategy'; import { ConfigReader } from '@backstage/config'; -const MockedConfigReader = ConfigReader as jest.MockedClass< - typeof ConfigReader ->; - -jest.mock('@backstage/config'); - describe('DefaultDocsBuildStrategy', () => { const entity = { apiVersion: 'backstage.io/v1alpha1', @@ -33,32 +27,40 @@ describe('DefaultDocsBuildStrategy', () => { }, }; - const config = new ConfigReader({}); - - beforeEach(() => { - jest.resetAllMocks(); - }); - describe('shouldBuild', () => { - it('should return true when techdocs.build is set to local', async () => { - const defaultDocsBuildStrategy = - DefaultDocsBuildStrategy.fromConfig(config); - - MockedConfigReader.prototype.getString.mockReturnValue('local'); + it('should return true when techdocs.builder is set to local', async () => { + const defaultDocsBuildStrategy = DefaultDocsBuildStrategy.fromConfig( + new ConfigReader({ + techdocs: { + builder: 'local', + }, + }), + ); const result = await defaultDocsBuildStrategy.shouldBuild({ entity }); expect(result).toBe(true); }); - it('should return false when techdocs.build is set to external', async () => { - const defaultDocsBuildStrategy = - DefaultDocsBuildStrategy.fromConfig(config); - - MockedConfigReader.prototype.getString.mockReturnValue('external'); + it('should return true when techdocs.builder is not set', async () => { + const defaultDocsBuildStrategy = DefaultDocsBuildStrategy.fromConfig( + new ConfigReader({ techdocs: {} }), + ); const result = await defaultDocsBuildStrategy.shouldBuild({ entity }); + expect(result).toBe(true); + }); + it('should return false when techdocs.builder is set to external', async () => { + const defaultDocsBuildStrategy = DefaultDocsBuildStrategy.fromConfig( + new ConfigReader({ + techdocs: { + builder: 'external', + }, + }), + ); + + const result = await defaultDocsBuildStrategy.shouldBuild({ entity }); expect(result).toBe(false); }); }); From d85dd88b3cea4c1ac49f08a389d6a9424e56d727 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 7 May 2024 13:27:02 +0000 Subject: [PATCH 136/136] Version Packages (next) --- .changeset/create-app-1715088359.md | 5 + .changeset/pre.json | 41 +- docs/releases/v1.27.0-next.2-changelog.md | 2411 +++++++++++++++++ package.json | 2 +- packages/app-next/CHANGELOG.md | 29 + packages/app-next/package.json | 2 +- packages/app/CHANGELOG.md | 27 + packages/app/package.json | 2 +- packages/backend-app-api/package.json | 2 +- packages/backend-common/CHANGELOG.md | 9 + packages/backend-common/package.json | 2 +- packages/backend-defaults/CHANGELOG.md | 9 + packages/backend-defaults/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- packages/backend-legacy/CHANGELOG.md | 26 + packages/backend-legacy/package.json | 2 +- packages/backend-test-utils/CHANGELOG.md | 9 + packages/backend-test-utils/package.json | 2 +- packages/cli/CHANGELOG.md | 11 + packages/cli/package.json | 2 +- packages/core-components/CHANGELOG.md | 7 + packages/core-components/package.json | 2 +- packages/create-app/CHANGELOG.md | 6 + packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 9 + packages/dev-utils/package.json | 2 +- packages/frontend-app-api/CHANGELOG.md | 12 + packages/frontend-app-api/package.json | 2 +- packages/frontend-test-utils/CHANGELOG.md | 8 + packages/frontend-test-utils/package.json | 2 +- packages/integration-react/CHANGELOG.md | 7 + packages/integration-react/package.json | 2 +- packages/integration/CHANGELOG.md | 6 + packages/integration/package.json | 2 +- packages/repo-tools/CHANGELOG.md | 11 + packages/repo-tools/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 11 + .../techdocs-cli-embedded-app/package.json | 2 +- plugins/api-docs/CHANGELOG.md | 12 + plugins/api-docs/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 6 + .../package.json | 2 +- plugins/auth-backend/CHANGELOG.md | 11 + plugins/auth-backend/package.json | 2 +- plugins/bitbucket-cloud-common/CHANGELOG.md | 7 + plugins/bitbucket-cloud-common/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 9 + .../catalog-backend-module-aws/package.json | 2 +- .../catalog-backend-module-azure/CHANGELOG.md | 9 + .../catalog-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../catalog-backend-module-gcp/CHANGELOG.md | 8 + .../catalog-backend-module-gcp/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../catalog-backend-module-ldap/CHANGELOG.md | 7 + .../catalog-backend-module-ldap/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/catalog-backend/CHANGELOG.md | 16 + plugins/catalog-backend/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 10 + plugins/catalog-graph/package.json | 2 +- plugins/catalog-import/CHANGELOG.md | 12 + plugins/catalog-import/package.json | 2 +- plugins/catalog-node/CHANGELOG.md | 7 + plugins/catalog-node/package.json | 2 +- plugins/catalog-react/CHANGELOG.md | 13 + plugins/catalog-react/package.json | 2 +- plugins/catalog/CHANGELOG.md | 17 + plugins/catalog/package.json | 2 +- plugins/devtools-backend/CHANGELOG.md | 8 + plugins/devtools-backend/package.json | 2 +- plugins/events-node/CHANGELOG.md | 6 + plugins/events-node/package.json | 2 +- plugins/home/CHANGELOG.md | 10 + plugins/home/package.json | 2 +- plugins/kubernetes-backend/CHANGELOG.md | 8 + plugins/kubernetes-backend/package.json | 2 +- plugins/kubernetes-cluster/CHANGELOG.md | 8 + plugins/kubernetes-cluster/package.json | 2 +- plugins/kubernetes/CHANGELOG.md | 8 + plugins/kubernetes/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/notifications-backend/CHANGELOG.md | 9 + plugins/notifications-backend/package.json | 2 +- plugins/notifications/CHANGELOG.md | 8 + plugins/notifications/package.json | 2 +- plugins/org-react/CHANGELOG.md | 8 + plugins/org-react/package.json | 2 +- plugins/org/CHANGELOG.md | 11 + plugins/org/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/scaffolder-backend/CHANGELOG.md | 20 + plugins/scaffolder-backend/package.json | 2 +- plugins/scaffolder-node/CHANGELOG.md | 9 + plugins/scaffolder-node/package.json | 2 +- plugins/scaffolder-react/CHANGELOG.md | 8 + plugins/scaffolder-react/package.json | 2 +- plugins/scaffolder/CHANGELOG.md | 14 + plugins/scaffolder/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/search-backend/CHANGELOG.md | 8 + plugins/search-backend/package.json | 2 +- plugins/search/CHANGELOG.md | 12 + plugins/search/package.json | 2 +- plugins/signals-backend/CHANGELOG.md | 9 + plugins/signals-backend/package.json | 2 +- .../techdocs-addons-test-utils/CHANGELOG.md | 11 + .../techdocs-addons-test-utils/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 11 + plugins/techdocs-backend/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/techdocs-node/CHANGELOG.md | 8 + plugins/techdocs-node/package.json | 2 +- plugins/techdocs/CHANGELOG.md | 14 + plugins/techdocs/package.json | 2 +- plugins/user-settings/CHANGELOG.md | 10 + plugins/user-settings/package.json | 2 +- yarn.lock | 37 +- 174 files changed, 3437 insertions(+), 88 deletions(-) create mode 100644 .changeset/create-app-1715088359.md create mode 100644 docs/releases/v1.27.0-next.2-changelog.md create mode 100644 plugins/scaffolder-backend-module-notifications/CHANGELOG.md diff --git a/.changeset/create-app-1715088359.md b/.changeset/create-app-1715088359.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1715088359.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/pre.json b/.changeset/pre.json index f776d90b91..4a813e4e19 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -283,73 +283,112 @@ "@backstage/plugin-vault-node": "0.1.10", "@backstage/plugin-xcmetrics": "0.2.52", "@backstage/plugin-catalog-backend-module-gitlab-org": "0.0.0", - "@backstage/plugin-notifications-backend-module-email": "0.0.0" + "@backstage/plugin-notifications-backend-module-email": "0.0.0", + "example-backend-legacy": "0.2.98-next.1", + "@backstage/plugin-scaffolder-backend-module-notifications": "0.0.0" }, "changesets": [ "afraid-needles-divide", "blue-hotels-shake", + "brave-carrots-glow", "bright-pumpkins-rule", "chatty-cycles-unite", "chilly-adults-sing", "chilly-fireants-roll", "chilly-shoes-doubt", + "cold-cougars-float", "cold-rats-leave", "cool-elephants-march", "create-app-1714476054", + "create-app-1715088359", "cuddly-chairs-kick", "curly-shirts-flow", "curvy-planes-flash", + "cyan-eagles-hammer", "cyan-suns-shave", + "dirty-chairs-march", "dry-sloths-impress", + "early-starfishes-hammer", "eighty-apricots-kneel", "eighty-bats-stare", "eleven-pandas-divide", + "empty-beers-relax", "fix-stackoverflow", + "flat-countries-clap", "fluffy-hotels-wait", "four-cooks-serve", "fresh-crews-impress", "funny-bees-taste", "fuzzy-seahorses-tell", + "giant-donkeys-talk", "gold-waves-bake", "gorgeous-cameras-cross", "green-adults-push", "green-boxes-rescue", + "grumpy-toes-tap", + "happy-radios-kiss", + "healthy-dots-ring", + "healthy-shirts-roll", + "heavy-trainers-fly", "hip-carrots-drive", "hot-forks-train", "itchy-gorillas-hope", "itchy-keys-wonder", + "kind-toes-scream", "late-planes-fix", + "lazy-phones-worry", + "little-rockets-live", "loud-frogs-eat", "loud-timers-flow", "loud-vans-greet", "lovely-games-cry", "lucky-news-guess", "mean-ravens-dance", + "metal-years-rhyme", + "new-poets-promise", "orange-numbers-think", + "perfect-beers-explode", "perfect-points-hope", + "pink-years-peel", + "proud-comics-love", "proud-doors-cheat", "purple-parents-sin", "purple-waves-smile", + "quick-cats-argue", + "quiet-boxes-build", "rare-fireants-tickle", "real-crabs-obey", "renovate-0d0bd5c", + "rich-adults-float", "selfish-pigs-glow", + "selfish-walls-visit", + "sharp-glasses-live", "shy-students-clap", "silent-wombats-hang", "six-scissors-smile", + "sixty-bears-camp", + "slimy-kids-behave", "smart-avocados-invent", "smooth-garlics-behave", "sour-socks-approve", "stupid-onions-know", "sweet-zoos-clap", + "swift-humans-hunt", "tall-ads-shave", + "tame-jars-double", "tasty-apes-learn", + "tasty-moles-jog", + "tasty-rats-explain", "thick-llamas-itch", "thick-terms-rush", + "thirty-mangos-travel", + "tough-eggs-wink", "tricky-cougars-shout", "unlucky-days-play", "unlucky-rivers-collect", "warm-fans-promise", + "wet-files-pretend", + "wild-seahorses-grin", "young-guests-reflect", "young-olives-drop" ] diff --git a/docs/releases/v1.27.0-next.2-changelog.md b/docs/releases/v1.27.0-next.2-changelog.md new file mode 100644 index 0000000000..ac8fb0534f --- /dev/null +++ b/docs/releases/v1.27.0-next.2-changelog.md @@ -0,0 +1,2411 @@ +# Release v1.27.0-next.2 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.27.0-next.2](https://backstage.github.io/upgrade-helper/?to=1.27.0-next.2) + +## @backstage/backend-app-api@0.7.3-next.1 + +# @backstage/backend-app-api + +## 0.7.2-next.1 + +### Patch Changes + +- 09f8988: Remove explicit `alg` check for user tokens in `verifyToken` +- Updated dependencies + - @backstage/backend-common@0.22.0-next.1 + - @backstage/backend-tasks@0.5.23-next.1 + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/plugin-permission-node@0.7.29-next.1 + - @backstage/cli-node@0.2.5 + - @backstage/config-loader@1.8.0 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.7.1-next.0 + +### Patch Changes + +- 4cd5ff0: Add ability to configure the Node.js HTTP Server when configuring the root HTTP Router service +- e8199b1: Move the JWKS registration outside of the lifecycle middleware +- dc8c5dd: The default `TokenManager` implementation no longer requires keys to be configured in production, but it will throw an errors when generating or authenticating tokens. The default `AuthService` implementation will now also provide additional context if such an error is throw when falling back to using the `TokenManager` service to generate tokens for outgoing requests. +- 025641b: Redact `meta` fields too with the logger +- 5863e02: Internal refactor to only create one external token handler +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-common@0.21.8-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/backend-tasks@0.5.23-next.0 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.5 + - @backstage/config@1.2.0 + - @backstage/config-loader@1.8.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.29-next.0 + +## 0.7.0 + +### Minor Changes + +- 3256f14: **BREAKING**: Modules are no longer loaded unless the plugin that they extend is present. + +### Patch Changes + +- 10327fb: Deprecate the `getPath` option for the `httpRouterServiceFactory` and more generally the ability to configure plugin API paths to be anything else than `/api/:pluginId/`. Requests towards `/api/*` that do not match an installed plugin will also no longer be handled by the index router, typically instead returning a 404. + +- 2c50516: Fix auth cookie issuance for split backend deployments by preferring to set it against the request target host instead of origin + +- 7e584d6: Fixed a bug where expired cookies would not be refreshed. + +- 1a20b12: Make the auth service create and validate dedicated OBO tokens, containing the user identity proof. + +- 00fca28: Implemented support for external access using both the legacy token form and static tokens. + +- d5a1fe1: Replaced winston logger with `LoggerService` + +- bce0879: Service-to-service authentication has been improved. + + Each plugin now has the capability to generate its own signing keys for token issuance. The generated public keys are stored in a database, and they are made accessible through a newly created endpoint: `/.backstage/auth/v1/jwks.json`. + + `AuthService` can now issue tokens with a reduced scope using the `getPluginRequestToken` method. This improvement enables plugins to identify the plugin originating the request. + +- 54f2ac8: Added `initialization` option to `createServiceFactory` which defines the initialization strategy for the service. The default strategy mimics the current behavior where plugin scoped services are initialized lazily by default and root scoped services are initialized eagerly. + +- 56f81b5: Improved error message thrown by `AuthService` when requesting a token for plugins that don't support the new authentication tokens. + +- 25ea3d2: Minor internal restructuring + +- d62bc51: Add support for limited user tokens by using user identity proof provided by the auth backend. + +- c884b9a: Automatically creates a get and delete cookie endpoint when a `user-cookie` policy is added. + +- Updated dependencies + - @backstage/backend-common@0.21.7 + - @backstage/config-loader@1.8.0 + - @backstage/plugin-permission-node@0.7.28 + - @backstage/backend-plugin-api@0.6.17 + - @backstage/backend-tasks@0.5.22 + - @backstage/plugin-auth-node@0.4.12 + - @backstage/cli-node@0.2.5 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.7.0-next.1 + +### Minor Changes + +- 3256f14: **BREAKING**: Modules are no longer loaded unless the plugin that they extend is present. + +### Patch Changes + +- 10327fb: Deprecate the `getPath` option for the `httpRouterServiceFactory` and more generally the ability to configure plugin API paths to be anything else than `/api/:pluginId/`. Requests towards `/api/*` that do not match an installed plugin will also no longer be handled by the index router, typically instead returning a 404. + +- 1a20b12: Make the auth service create and validate dedicated OBO tokens, containing the user identity proof. + +- bce0879: Service-to-service authentication has been improved. + + Each plugin now has the capability to generate its own signing keys for token issuance. The generated public keys are stored in a database, and they are made accessible through a newly created endpoint: `/.backstage/auth/v1/jwks.json`. + + `AuthService` can now issue tokens with a reduced scope using the `getPluginRequestToken` method. This improvement enables plugins to identify the plugin originating the request. + +- 54f2ac8: Added `initialization` option to `createServiceFactory` which defines the initialization strategy for the service. The default strategy mimics the current behavior where plugin scoped services are initialized lazily by default and root scoped services are initialized eagerly. + +- d62bc51: Add support for limited user tokens by using user identity proof provided by the auth backend. + +- c884b9a: Automatically creates a get and delete cookie endpoint when a `user-cookie` policy is added. + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.1 + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + - @backstage/backend-tasks@0.5.22-next.1 + - @backstage/plugin-permission-node@0.7.28-next.1 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.4 + - @backstage/config@1.2.0 + - @backstage/config-loader@1.8.0-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.6.3-next.0 + +### Patch Changes + +- 7e584d6: Fixed a bug where expired cookies would not be refreshed. +- Updated dependencies + - @backstage/backend-common@0.21.7-next.0 + - @backstage/config-loader@1.8.0-next.0 + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/backend-tasks@0.5.22-next.0 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.4 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.12-next.0 + - @backstage/plugin-permission-node@0.7.28-next.0 + +## 0.6.2 + +### Patch Changes + +- e848644: Temporarily revert the rate limiting +- Updated dependencies + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-common@0.21.6 + - @backstage/backend-plugin-api@0.6.16 + - @backstage/plugin-permission-node@0.7.27 + - @backstage/backend-tasks@0.5.21 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.4 + - @backstage/config@1.2.0 + - @backstage/config-loader@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.6.1 + +### Patch Changes + +- de1f45d: Temporarily revert the rate limiting +- Updated dependencies + - @backstage/backend-common@0.21.5 + - @backstage/plugin-auth-node@0.4.10 + - @backstage/backend-tasks@0.5.20 + - @backstage/plugin-permission-node@0.7.26 + - @backstage/backend-plugin-api@0.6.15 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.4 + - @backstage/config@1.2.0 + - @backstage/config-loader@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.6.0 + +### Minor Changes + +- 4a3d434: **BREAKING**: For users that have migrated to the new backend system, incoming requests will now be rejected if they are not properly authenticated (e.g. with a Backstage bearer token or a backend token). Please see the [Auth Service Migration tutorial](https://backstage.io/docs/tutorials/auth-service-migration) for more information on how to circumvent this behavior in the short term and how to properly leverage it in the longer term. + + Added service factories for the new [`auth`](https://backstage.io/docs/backend-system/core-services/auth/), [`httpAuth`](https://backstage.io/docs/backend-system/core-services/http-auth), and [`userInfo`](https://backstage.io/docs/backend-system/core-services/user-info) services that were created as part of [BEP-0003](https://github.com/backstage/backstage/tree/master/beps/0003-auth-architecture-evolution). + +### Patch Changes + +- 999224f: Bump dependency `minimatch` to v9 +- 81e0120: Fixed an issue where configuration schema for the purpose of redacting secrets from logs was not being read correctly. +- 15fda44: Provide some sane defaults for `WinstonLogger.create` making some of the arguments optional +- 0502d82: Updated the `permissionsServiceFactory` to forward the `AuthService` to the implementation. +- 9d91128: Add the possibility to disable watching files in the new backend system +- a5d341e: Adds an initial rate-limiting implementation so that any incoming requests that have a `'none'` principal are rate-limited automatically. +- 9802004: Made the `DefaultUserInfoService` claims check stricter +- f235ca7: Make sure to not filter out schemas in `createConfigSecretEnumerator` +- af5f7a6: The experimental feature discovery service exported at the `/alpha` sub-path will no longer attempt to load packages that are not Backstage backend packages. +- Updated dependencies + - @backstage/backend-common@0.21.4 + - @backstage/plugin-auth-node@0.4.9 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/backend-plugin-api@0.6.14 + - @backstage/config-loader@1.7.0 + - @backstage/backend-tasks@0.5.19 + - @backstage/plugin-permission-node@0.7.25 + - @backstage/cli-node@0.2.4 + - @backstage/cli-common@0.1.13 + - @backstage/types@1.1.1 + +## 0.6.0-next.2 + +### Patch Changes + +- 15fda44: Provide some sane defaults for `WinstonLogger.create` making some of the arguments optional +- 9d91128: Add the possibility to disable watching files in the new backend system +- Updated dependencies + - @backstage/backend-common@0.21.4-next.2 + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + - @backstage/backend-tasks@0.5.19-next.2 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.4-next.0 + - @backstage/config@1.2.0-next.1 + - @backstage/config-loader@1.7.0-next.1 + - @backstage/errors@1.2.4-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.25-next.2 + +## 0.6.0-next.1 + +### Patch Changes + +- 81e0120: Fixed an issue where configuration schema for the purpose of redacting secrets from logs was not being read correctly. +- f235ca7: Make sure to not filter out schemas in `createConfigSecretEnumerator` +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/config-loader@1.7.0-next.1 + - @backstage/backend-common@0.21.4-next.1 + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/backend-tasks@0.5.19-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + - @backstage/plugin-permission-node@0.7.25-next.1 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.4-next.0 + - @backstage/errors@1.2.4-next.0 + - @backstage/types@1.1.1 + +## 0.6.0-next.0 + +### Minor Changes + +- 4a3d434: **BREAKING**: For users that have migrated to the new backend system, incoming requests will now be rejected if they are not properly authenticated (e.g. with a Backstage bearer token or a backend token). Please see the [Auth Service Migration tutorial](https://backstage.io/docs/tutorials/auth-service-migration) for more information on how to circumvent this behavior in the short term and how to properly leverage it in the longer term. + + Added service factories for the new [`auth`](https://backstage.io/docs/backend-system/core-services/auth/), [`httpAuth`](https://backstage.io/docs/backend-system/core-services/http-auth), and [`userInfo`](https://backstage.io/docs/backend-system/core-services/user-info) services that were created as part of [BEP-0003](https://github.com/backstage/backstage/tree/master/beps/0003-auth-architecture-evolution). + +### Patch Changes + +- 999224f: Bump dependency `minimatch` to v9 +- 0502d82: Updated the `permissionsServiceFactory` to forward the `AuthService` to the implementation. +- 9802004: Made the `DefaultUserInfoService` claims check stricter +- Updated dependencies + - @backstage/backend-common@0.21.3-next.0 + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/errors@1.2.4-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + - @backstage/backend-tasks@0.5.18-next.0 + - @backstage/plugin-permission-node@0.7.24-next.0 + - @backstage/cli-node@0.2.4-next.0 + - @backstage/config-loader@1.6.3-next.0 + - @backstage/config@1.1.2-next.0 + - @backstage/cli-common@0.1.13 + - @backstage/types@1.1.1 + +## 0.5.11 + +### Patch Changes + +- e0c18ef: Include the extension point ID and the module ID in the backend init error message. +- 7ae5704: Updated the default error handling middleware to filter out certain known error types that should never be returned in responses. The errors are instead logged along with a correlation ID, which is also returned in the response. Initially only PostgreSQL protocol errors from the `pg-protocol` package are filtered out. +- 9aac2b0: Use `--cwd` as the first `yarn` argument +- 54ad8e1: Allow the `createConfigSecretEnumerator` to take an optional `schema` argument with an already-loaded global configuration schema. +- 6bb6f3e: Updated dependency `fs-extra` to `^11.2.0`. + Updated dependency `@types/fs-extra` to `^11.0.0`. +- Updated dependencies + - @backstage/backend-common@0.21.0 + - @backstage/plugin-auth-node@0.4.4 + - @backstage/cli-node@0.2.3 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/backend-tasks@0.5.15 + - @backstage/config-loader@1.6.2 + - @backstage/plugin-permission-node@0.7.21 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.5.11-next.3 + +### Patch Changes + +- 54ad8e1: Allow the `createConfigSecretEnumerator` to take an optional `schema` argument with an already-loaded global configuration schema. +- Updated dependencies + - @backstage/backend-common@0.21.0-next.3 + - @backstage/cli-node@0.2.3-next.0 + - @backstage/backend-tasks@0.5.15-next.3 + - @backstage/config-loader@1.6.2-next.0 + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/plugin-permission-node@0.7.21-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.5.11-next.2 + +### Patch Changes + +- 9aac2b0: Use `--cwd` as the first `yarn` argument +- Updated dependencies + - @backstage/backend-common@0.21.0-next.2 + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/backend-tasks@0.5.15-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + - @backstage/plugin-permission-node@0.7.21-next.2 + - @backstage/config@1.1.1 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.2 + - @backstage/config-loader@1.6.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.5.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/backend-common@0.21.0-next.1 + - @backstage/backend-tasks@0.5.15-next.1 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.2 + - @backstage/config@1.1.1 + - @backstage/config-loader@1.6.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.4-next.1 + - @backstage/plugin-permission-node@0.7.21-next.1 + +## 0.5.11-next.0 + +### Patch Changes + +- e0c18ef: Include the extension point ID and the module ID in the backend init error message. +- Updated dependencies + - @backstage/backend-common@0.21.0-next.0 + - @backstage/backend-tasks@0.5.15-next.0 + - @backstage/cli-node@0.2.2 + - @backstage/config-loader@1.6.1 + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/plugin-permission-node@0.7.21-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.5.10 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/config-loader@1.6.1 + - @backstage/cli-node@0.2.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/backend-tasks@0.5.14 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.5.10-next.2 + +### Patch Changes + +- 516fd3e: Updated README to reflect release status +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/backend-tasks@0.5.14-next.2 + - @backstage/cli-node@0.2.2-next.0 + - @backstage/config-loader@1.6.1-next.0 + +## 0.5.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.6.1-next.0 + - @backstage/cli-node@0.2.2-next.0 + - @backstage/backend-common@0.20.1-next.1 + - @backstage/config@1.1.1 + - @backstage/backend-tasks@0.5.14-next.1 + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/plugin-permission-node@0.7.20-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + - @backstage/cli-common@0.1.13 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.0 + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/backend-tasks@0.5.14-next.0 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.1 + - @backstage/config@1.1.1 + - @backstage/config-loader@1.6.0 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.3-next.0 + - @backstage/plugin-permission-node@0.7.20-next.0 + +## 0.5.9 + +### Patch Changes + +- 1da5f43: Ensure redaction of secrets that have accidental extra whitespace around them +- 9f8f266: Add redacting for secrets in stack traces of logs +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/config-loader@1.6.0 + - @backstage/backend-tasks@0.5.13 + - @backstage/plugin-auth-node@0.4.2 + - @backstage/plugin-permission-node@0.7.19 + - @backstage/cli-node@0.2.1 + - @backstage/backend-plugin-api@0.6.8 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.5.9-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/backend-tasks@0.5.13-next.3 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.0 + - @backstage/config@1.1.1 + - @backstage/config-loader@1.6.0-next.0 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.2-next.3 + - @backstage/plugin-permission-node@0.7.19-next.3 + +## 0.5.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.6.0-next.0 + - @backstage/backend-common@0.20.0-next.2 + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + - @backstage/backend-tasks@0.5.13-next.2 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.19-next.2 + +## 0.5.9-next.1 + +### Patch Changes + +- 1da5f434f3: Ensure redaction of secrets that have accidental extra whitespace around them +- 9f8f266ff4: Add redacting for secrets in stack traces of logs +- Updated dependencies + - @backstage/backend-common@0.20.0-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/backend-tasks@0.5.13-next.1 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.0 + - @backstage/config@1.1.1 + - @backstage/config-loader@1.5.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.2-next.1 + - @backstage/plugin-permission-node@0.7.19-next.1 + +## 0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.0 + - @backstage/backend-tasks@0.5.13-next.0 + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/plugin-permission-node@0.7.19-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.0 + - @backstage/config@1.1.1 + - @backstage/config-loader@1.5.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.5.8 + +### Patch Changes + +- bc9a18d5ec: Added a workaround for double `default` wrapping when dynamically importing CommonJS modules with default exports. +- Updated dependencies + - @backstage/config-loader@1.5.3 + - @backstage/cli-node@0.2.0 + - @backstage/backend-common@0.19.9 + - @backstage/backend-plugin-api@0.6.7 + - @backstage/backend-tasks@0.5.12 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.1 + - @backstage/plugin-permission-node@0.7.18 + +## 0.5.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.2 + - @backstage/backend-common@0.19.9-next.2 + - @backstage/backend-tasks@0.5.12-next.2 + - @backstage/plugin-auth-node@0.4.1-next.2 + - @backstage/plugin-permission-node@0.7.18-next.2 + - @backstage/config-loader@1.5.3-next.0 + +## 0.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9-next.1 + - @backstage/backend-tasks@0.5.12-next.1 + - @backstage/config-loader@1.5.3-next.0 + - @backstage/plugin-auth-node@0.4.1-next.1 + - @backstage/plugin-permission-node@0.7.18-next.1 + - @backstage/backend-plugin-api@0.6.7-next.1 + - @backstage/cli-common@0.1.13 + - @backstage/cli-node@0.2.0-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.5.8-next.0 + +### Patch Changes + +- bc9a18d5ec: Added a workaround for double `default` wrapping when dynamically importing CommonJS modules with default exports. +- Updated dependencies + - @backstage/config-loader@1.5.2-next.0 + - @backstage/cli-node@0.2.0-next.0 + - @backstage/backend-common@0.19.9-next.0 + - @backstage/backend-plugin-api@0.6.7-next.0 + - @backstage/backend-tasks@0.5.12-next.0 + - @backstage/cli-common@0.1.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.1-next.0 + - @backstage/plugin-permission-node@0.7.18-next.0 + +## 0.5.6 + +### Patch Changes + +- 74491c9602: Moved `HostDiscovery` from `@backstage/backend-common`. +- a4617c422a: Added `watch` option to configuration loaders that can be used to disable file watching by setting it to `false`. +- Updated dependencies + - @backstage/backend-tasks@0.5.11 + - @backstage/backend-common@0.19.8 + - @backstage/plugin-auth-node@0.4.0 + - @backstage/config-loader@1.5.1 + - @backstage/errors@1.2.3 + - @backstage/cli-common@0.1.13 + - @backstage/backend-plugin-api@0.6.6 + - @backstage/plugin-permission-node@0.7.17 + - @backstage/cli-node@0.1.5 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 0.5.6-next.2 + +### Patch Changes + +- 74491c9602: Moved `HostDiscovery` from `@backstage/backend-common`. +- a4617c422a: Added `watch` option to configuration loaders that can be used to disable file watching by setting it to `false`. +- Updated dependencies + - @backstage/backend-common@0.19.8-next.2 + - @backstage/plugin-auth-node@0.4.0-next.2 + - @backstage/config-loader@1.5.1-next.1 + - @backstage/errors@1.2.3-next.0 + - @backstage/backend-tasks@0.5.11-next.2 + - @backstage/plugin-permission-node@0.7.17-next.2 + - @backstage/backend-plugin-api@0.6.6-next.2 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/cli-node@0.1.5-next.1 + - @backstage/config@1.1.1-next.0 + - @backstage/types@1.1.1 + +## 0.5.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.10-next.1 + - @backstage/backend-common@0.19.7-next.1 + - @backstage/backend-plugin-api@0.6.5-next.1 + - @backstage/plugin-auth-node@0.3.2-next.1 + - @backstage/plugin-permission-node@0.7.16-next.1 + - @backstage/config@1.1.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/cli-node@0.1.5-next.0 + - @backstage/config-loader@1.5.1-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.5.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/config-loader@1.5.1-next.0 + - @backstage/cli-common@0.1.13-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/backend-tasks@0.5.10-next.0 + - @backstage/cli-node@0.1.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## 0.5.3 + +### Patch Changes + +- 154632d8753b: Add support for discovering additional service factories during startup. +- 37a20c7f14aa: Adds include and exclude configuration to feature discovery of backend packages + Adds alpha modules to feature discovery +- cb7fc410ed99: The experimental backend feature discovery now only considers default exports from packages. It no longer filters packages to include based on the package role, except that `'cli'` packages are ignored. However, the `"backstage"` field is still required in `package.json`. +- 3fc64b9e2f8f: Extension points are now tracked via their ID rather than reference, in order to support package duplication. +- 3b30b179cb38: Add support for installing features as package imports, for example `backend.add(import('my-plugin'))`. +- b219d097b3f4: Backend startup will now fail if any circular service dependencies are detected. +- Updated dependencies + - @backstage/backend-tasks@0.5.8 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/config-loader@1.5.0 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4 + +## 0.5.3-next.3 + +### Patch Changes + +- 154632d8753b: Add support for discovering additional service factories during startup. +- cb7fc410ed99: The experimental backend feature discovery now only considers default exports from packages. It no longer filters packages to include based on the package role, except that `'cli'` packages are ignored. However, the `"backstage"` field is still required in `package.json`. +- 3b30b179cb38: Add support for installing features as package imports, for example `backend.add(import('my-plugin'))`. +- Updated dependencies + - @backstage/config@1.1.0-next.2 + - @backstage/errors@1.2.2-next.0 + - @backstage/types@1.1.1-next.0 + - @backstage/plugin-permission-node@0.7.14-next.3 + - @backstage/backend-plugin-api@0.6.3-next.3 + - @backstage/backend-common@0.19.5-next.3 + - @backstage/backend-tasks@0.5.8-next.3 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.4-next.0 + - @backstage/config-loader@1.5.0-next.3 + - @backstage/plugin-auth-node@0.3.0-next.3 + +## 0.5.3-next.2 + +### Patch Changes + +- 37a20c7f14aa: Adds include and exclude configuration to feature discovery of backend packages + Adds alpha modules to feature discovery +- 3fc64b9e2f8f: Extension points are now tracked via their ID rather than reference, in order to support package duplication. +- b219d097b3f4: Backend startup will now fail if any circular service dependencies are detected. +- Updated dependencies + - @backstage/config-loader@1.5.0-next.2 + - @backstage/config@1.1.0-next.1 + - @backstage/backend-tasks@0.5.8-next.2 + - @backstage/backend-common@0.19.5-next.2 + - @backstage/plugin-auth-node@0.3.0-next.2 + - @backstage/plugin-permission-node@0.7.14-next.2 + - @backstage/backend-plugin-api@0.6.3-next.2 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.3 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.0 + - @backstage/backend-tasks@0.5.8-next.1 + - @backstage/backend-common@0.19.5-next.1 + - @backstage/backend-plugin-api@0.6.3-next.1 + - @backstage/config-loader@1.5.0-next.1 + - @backstage/plugin-auth-node@0.3.0-next.1 + - @backstage/plugin-permission-node@0.7.14-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.3 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.5.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0-next.0 + - @backstage/backend-common@0.19.4-next.0 + - @backstage/config-loader@1.5.0-next.0 + - @backstage/backend-tasks@0.5.7-next.0 + - @backstage/backend-plugin-api@0.6.2-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/cli-node@0.1.3 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-permission-node@0.7.13-next.0 + +## 0.5.0 + +### Minor Changes + +- b9c57a4f857e: **BREAKING**: Renamed `configServiceFactory` to `rootConfigServiceFactory`. +- a6d7983f349c: **BREAKING**: Removed the `services` option from `createBackend`. Service factories are now `BackendFeature`s and should be installed with `backend.add(...)` instead. The following should be migrated: + + ```ts + const backend = createBackend({ services: [myCustomServiceFactory] }); + ``` + + To instead pass the service factory via `backend.add(...)`: + + ```ts + const backend = createBackend(); + backend.add(customRootLoggerServiceFactory); + ``` + +### Patch Changes + +- e65c4896f755: Do not throw in backend.stop, if start failed +- c7aa4ff1793c: Allow modules to register extension points. +- 57a10c6c69cc: Add validation to make sure that extension points do not cross plugin boundaries. +- cc9256a33bcc: Added new experimental `featureDiscoveryServiceFactory`, available as an `/alpha` export. +- Updated dependencies + - @backstage/backend-common@0.19.2 + - @backstage/config-loader@1.4.0 + - @backstage/backend-plugin-api@0.6.0 + - @backstage/cli-node@0.1.3 + - @backstage/plugin-auth-node@0.2.17 + - @backstage/backend-tasks@0.5.5 + - @backstage/plugin-permission-node@0.7.11 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.5.0-next.2 + +### Patch Changes + +- e65c4896f755: Do not throw in backend.stop, if start failed +- cc9256a33bcc: Added new experimental `featureDiscoveryServiceFactory`, available as an `/alpha` export. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.0-next.2 + - @backstage/backend-tasks@0.5.5-next.2 + - @backstage/backend-common@0.19.2-next.2 + - @backstage/plugin-permission-node@0.7.11-next.2 + - @backstage/plugin-auth-node@0.2.17-next.2 + - @backstage/config-loader@1.4.0-next.1 + +## 0.5.0-next.1 + +### Minor Changes + +- b9c57a4f857e: **BREAKING**: Renamed `configServiceFactory` to `rootConfigServiceFactory`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config-loader@1.4.0-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.4.0-next.0 + - @backstage/backend-common@0.19.2-next.0 + - @backstage/backend-plugin-api@0.5.5-next.0 + - @backstage/backend-tasks@0.5.5-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-auth-node@0.2.17-next.0 + - @backstage/plugin-permission-node@0.7.11-next.0 + +## 0.4.5 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1 + - @backstage/backend-common@0.19.1 + - @backstage/backend-plugin-api@0.5.4 + - @backstage/backend-tasks@0.5.4 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/config-loader@1.3.2 + - @backstage/types@1.1.0 + - @backstage/plugin-auth-node@0.2.16 + - @backstage/plugin-permission-node@0.7.10 + +## 0.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1-next.0 + - @backstage/backend-common@0.19.1-next.0 + - @backstage/backend-plugin-api@0.5.4-next.0 + - @backstage/backend-tasks@0.5.4-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/config-loader@1.3.2-next.0 + - @backstage/types@1.1.0 + - @backstage/plugin-auth-node@0.2.16-next.0 + - @backstage/plugin-permission-node@0.7.10-next.0 + +## 0.4.4 + +### Patch Changes + +- 3bb4158a8aa4: Switched startup strategy to initialize all plugins in parallel, as well as hook into the new startup lifecycle hooks. +- 68a21956ef52: Remove reference to deprecated import +- a5c5491ff50c: Use `durationToMilliseconds` from `@backstage/types` instead of our own +- 2c9f67e6f166: Introduced built-in middleware into the default `HttpService` implementation that throws a `ServiceNotAvailable` error when plugins aren't able to serve request. Also introduced a request stalling mechanism that pauses incoming request until plugins have been fully initialized. +- c4e8fefd9f13: Added handling of `ServiceUnavailableError` to error handling middleware. +- Updated dependencies + - @backstage/backend-common@0.19.0 + - @backstage/types@1.1.0 + - @backstage/config-loader@1.3.1 + - @backstage/errors@1.2.0 + - @backstage/backend-plugin-api@0.5.3 + - @backstage/backend-tasks@0.5.3 + - @backstage/plugin-auth-node@0.2.15 + - @backstage/plugin-permission-node@0.7.9 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + +## 0.4.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.2 + - @backstage/backend-plugin-api@0.5.3-next.2 + - @backstage/backend-tasks@0.5.3-next.2 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.3.1-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.15-next.2 + - @backstage/plugin-permission-node@0.7.9-next.2 + +## 0.4.4-next.1 + +### Patch Changes + +- 3bb4158a8aa4: Switched startup strategy to initialize all plugins in parallel, as well as hook into the new startup lifecycle hooks. +- 2c9f67e6f166: Introduced built-in middleware into the default `HttpService` implementation that throws a `ServiceNotAvailable` error when plugins aren't able to serve request. Also introduced a request stalling mechanism that pauses incoming request until plugins have been fully initialized. +- c4e8fefd9f13: Added handling of `ServiceUnavailableError` to error handling middleware. +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/backend-tasks@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/config-loader@1.3.1-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.3.1-next.0 + - @backstage/backend-common@0.18.6-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.3-next.0 + - @backstage/backend-tasks@0.5.3-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.15-next.0 + - @backstage/plugin-permission-node@0.7.9-next.0 + +## 0.4.3 + +### Patch Changes + +- cf13b482f9e: Switch `configServiceFactory` to use `ConfigSources` from `@backstage/config-loader` to load config. +- Updated dependencies + - @backstage/backend-common@0.18.5 + - @backstage/config-loader@1.3.0 + - @backstage/plugin-permission-node@0.7.8 + - @backstage/backend-tasks@0.5.2 + - @backstage/plugin-auth-node@0.2.14 + - @backstage/backend-plugin-api@0.5.2 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.1 + - @backstage/backend-tasks@0.5.2-next.1 + - @backstage/plugin-auth-node@0.2.14-next.1 + - @backstage/plugin-permission-node@0.7.8-next.1 + - @backstage/backend-plugin-api@0.5.2-next.1 + - @backstage/config-loader@1.3.0-next.0 + - @backstage/config@1.0.7 + +## 0.4.3-next.0 + +### Patch Changes + +- cf13b482f9e: Switch `configServiceFactory` to use `ConfigSources` from `@backstage/config-loader` to load config. +- Updated dependencies + - @backstage/backend-common@0.18.5-next.0 + - @backstage/config-loader@1.3.0-next.0 + - @backstage/plugin-permission-node@0.7.8-next.0 + - @backstage/backend-tasks@0.5.2-next.0 + - @backstage/plugin-auth-node@0.2.14-next.0 + - @backstage/backend-plugin-api@0.5.2-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.4.2 + +### Patch Changes + +- 5c7ce585824: Allow an additionalConfig to be provided to loadBackendConfig that fetches config values during runtime. +- 8cce2205a39: Register unhandled rejection and uncaught exception handlers to avoid backend crashes. +- Updated dependencies + - @backstage/backend-common@0.18.4 + - @backstage/config-loader@1.2.0 + - @backstage/plugin-permission-node@0.7.7 + - @backstage/backend-tasks@0.5.1 + - @backstage/plugin-auth-node@0.2.13 + - @backstage/backend-plugin-api@0.5.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.4.2-next.2 + +### Patch Changes + +- 5c7ce585824: Allow an additionalConfig to be provided to loadBackendConfig that fetches config values during runtime. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/backend-tasks@0.5.1-next.2 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## 0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/backend-tasks@0.5.1-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## 0.4.2-next.0 + +### Patch Changes + +- 8cce2205a39: Register unhandled rejection and uncaught exception handlers to avoid backend crashes. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/backend-tasks@0.5.1-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/config-loader@1.1.9 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-node@0.7.7-next.0 + +## 0.4.1 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- 915e46622cf: Add support for `NotImplementedError`, properly returning 501 as status code. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config-loader@1.1.9 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/config@1.0.7-next.0 + +## 0.4.1-next.1 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- 915e46622cf: Add support for `NotImplementedError`, properly returning 501 as status code. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6-next.1 + - @backstage/errors@1.1.5-next.0 + - @backstage/backend-common@0.18.3-next.1 + - @backstage/config-loader@1.1.9-next.0 + - @backstage/plugin-auth-node@0.2.12-next.1 + - @backstage/backend-plugin-api@0.4.1-next.1 + - @backstage/backend-tasks@0.4.4-next.1 + - @backstage/cli-common@0.1.12-next.0 + - @backstage/config@1.0.7-next.0 + - @backstage/types@1.0.2 + +## 0.4.1-next.0 + +### Patch Changes + +- 928a12a9b3: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-tasks@0.4.4-next.0 + - @backstage/backend-plugin-api@0.4.1-next.0 + - @backstage/backend-common@0.18.3-next.0 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.12-next.0 + - @backstage/plugin-permission-node@0.7.6-next.0 + +## 0.4.0 + +### Minor Changes + +- 01a075ec1d: **BREAKING**: Renamed `RootHttpRouterConfigureOptions` to `RootHttpRouterConfigureContext`, and removed the unused type `ServiceOrExtensionPoint`. +- 4ae71b7f2e: **BREAKING** Renaming `*Factory` exports to `*ServiceFactory` instead. For example `configFactory` now is exported as `configServiceFactory`. +- d31d8e00b3: **BREAKING** `HttpServerCertificateOptions` when specified with a `key` and `cert` should also have the `type: 'pem'` instead of `type: 'plain'` + +### Patch Changes + +- a18da2f8b5: Fixed an issue were the log redaction didn't properly escape RegExp characters. +- 5febb216fe: Updated to match the new `CacheService` interface. +- e716946103: Updated usage of the lifecycle service. +- f60cca9da1: Updated database factory to pass service deps required for restoring database state during development. +- 610d65e143: Updates to match new `BackendFeature` type. +- 725383f69d: Tweaked messaging in the README. +- b86efa2d04: Updated usage of `ServiceFactory`. +- ab22515647: The shutdown signal handlers are now installed as part of the backend instance rather than the lifecycle service, and explicitly cause the process to exit. +- b729f9f31f: Moved the options of the `config` and `rootHttpRouter` services out to the factories themselves, where they belong +- ed8b5967d7: `HttpRouterFactoryOptions.getPath` is now optional as a default value is always provided in the factory. +- 71a5ec0f06: Updated usages of `LogMeta`. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0 + - @backstage/backend-common@0.18.2 + - @backstage/backend-tasks@0.4.3 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11 + - @backstage/plugin-permission-node@0.7.5 + +## 0.4.0-next.2 + +### Minor Changes + +- 01a075ec1d: **BREAKING**: Renamed `RootHttpRouterConfigureOptions` to `RootHttpRouterConfigureContext`, and removed the unused type `ServiceOrExtensionPoint`. +- 4ae71b7f2e: **BREAKING** Renaming `*Factory` exports to `*ServiceFactory` instead. For example `configFactory` now is exported as `configServiceFactory`. +- d31d8e00b3: **BREAKING** `HttpServerCertificateOptions` when specified with a `key` and `cert` should also have the `type: 'pem'` instead of `type: 'plain'` + +### Patch Changes + +- e716946103: Updated usage of the lifecycle service. +- f60cca9da1: Updated database factory to pass service deps required for restoring database state during development. +- 610d65e143: Updates to match new `BackendFeature` type. +- ab22515647: The shutdown signal handlers are now installed as part of the backend instance rather than the lifecycle service, and explicitly cause the process to exit. +- b729f9f31f: Moved the options of the `config` and `rootHttpRouter` services out to the factories themselves, where they belong +- 71a5ec0f06: Updated usages of `LogMeta`. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-tasks@0.4.3-next.1 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-node@0.7.5-next.1 + +## 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 + +## 0.3.0 + +### Minor Changes + +- 02b119ff93: **BREAKING**: The `httpRouterFactory` now accepts a `getPath` option rather than `indexPlugin`. To set up custom index path, configure the new `rootHttpRouterFactory` with a custom `indexPath` instead. + + Added an implementation for the new `rootHttpRouterServiceRef`. + +### Patch Changes + +- ecc6bfe4c9: Use new `ServiceFactoryOrFunction` type. +- b99c030f1b: Moved over implementation of the root HTTP service from `@backstage/backend-common`, and replaced the `middleware` option with a `configure` callback option. +- 170282ece6: Fixed a bug in the default token manager factory where it created multiple incompatible instances. +- 843a0a158c: Added service factory for the new core identity service. +- 150a7dd790: An error will now be thrown if attempting to override the plugin metadata service. +- 483e907eaf: Internal updates of `createServiceFactory` from `@backstage/backend-plugin-api`. +- 015a6dced6: The `createSpecializedBackend` function will now throw an error if duplicate service implementations are provided. +- e3fca10038: Tweaked the plugin logger to use `plugin` as the label for the plugin ID, rather than `pluginId`. +- ecbec4ec4c: Internal refactor to match new options pattern in the experimental backend system. +- 51b7a7ed07: Exported the default root HTTP router implementation as `DefaultRootHttpRouter`. It only implements the routing layer and needs to be exposed via an HTTP server similar to the built-in setup in the `rootHttpRouterFactory`. +- 0e63aab311: Moved over logging and configuration loading implementations from `@backstage/backend-common`. There is a now `WinstonLogger` which implements the `RootLoggerService` through Winston with accompanying utilities. For configuration the `loadBackendConfig` function has been moved over, but it now instead returns an object with a `config` property. +- 8e06f3cf00: Switched imports of `loggerToWinstonLogger` to `@backstage/backend-common`. +- 3b8fd4169b: Internal folder structure refactor. +- 6cfd4d7073: Updated implementations for the new `RootLifecycleService`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0 + - @backstage/backend-common@0.18.0 + - @backstage/backend-tasks@0.4.1 + - @backstage/config@1.0.6 + - @backstage/cli-common@0.1.11 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.9 + - @backstage/plugin-permission-node@0.7.3 + +## 0.3.0-next.1 + +### Minor Changes + +- 02b119ff93: **BREAKING**: The `httpRouterFactory` now accepts a `getPath` option rather than `indexPlugin`. To set up custom index path, configure the new `rootHttpRouterFactory` with a custom `indexPath` instead. + + Added an implementation for the new `rootHttpRouterServiceRef`. + +### Patch Changes + +- ecc6bfe4c9: Use new `ServiceFactoryOrFunction` type. +- b99c030f1b: Moved over implementation of the root HTTP service from `@backstage/backend-common`, and replaced the `middleware` option with a `configure` callback option. +- 150a7dd790: An error will now be thrown if attempting to override the plugin metadata service. +- 015a6dced6: The `createSpecializedBackend` function will now throw an error if duplicate service implementations are provided. +- e3fca10038: Tweaked the plugin logger to use `plugin` as the label for the plugin ID, rather than `pluginId`. +- 8e06f3cf00: Switched imports of `loggerToWinstonLogger` to `@backstage/backend-common`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0-next.1 + - @backstage/backend-common@0.18.0-next.1 + - @backstage/backend-tasks@0.4.1-next.1 + - @backstage/plugin-permission-node@0.7.3-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + +## 0.2.5-next.0 + +### Patch Changes + +- 6cfd4d7073: Updated implementations for the new `RootLifecycleService`. +- Updated dependencies + - @backstage/backend-plugin-api@0.2.1-next.0 + - @backstage/backend-common@0.18.0-next.0 + - @backstage/backend-tasks@0.4.1-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-node@0.7.3-next.0 + +## 0.2.4 + +### Patch Changes + +- cb1c2781c0: Updated logger implementations to match interface changes. +- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`. +- afa3bf5657: Added `.stop()` method to `Backend`. +- d6dbf1792b: Added `lifecycleFactory` implementation. +- 05a928e296: Updated usages of types from `@backstage/backend-plugin-api`. +- 5260d8fc7d: Root scoped services are now always initialized, regardless of whether they're used by any features. +- Updated dependencies + - @backstage/backend-common@0.17.0 + - @backstage/backend-tasks@0.4.0 + - @backstage/plugin-permission-node@0.7.2 + - @backstage/errors@1.1.4 + - @backstage/backend-plugin-api@0.2.0 + +## 0.2.4-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.4.0-next.3 + - @backstage/plugin-permission-node@0.7.2-next.3 + - @backstage/backend-common@0.17.0-next.3 + - @backstage/backend-plugin-api@0.2.0-next.3 + - @backstage/errors@1.1.4-next.1 + +## 0.2.4-next.2 + +### Patch Changes + +- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`. +- Updated dependencies + - @backstage/backend-common@0.17.0-next.2 + - @backstage/backend-plugin-api@0.2.0-next.2 + - @backstage/backend-tasks@0.4.0-next.2 + - @backstage/plugin-permission-node@0.7.2-next.2 + - @backstage/errors@1.1.4-next.1 + +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0-next.1 + - @backstage/backend-tasks@0.4.0-next.1 + - @backstage/backend-plugin-api@0.1.5-next.1 + - @backstage/plugin-permission-node@0.7.2-next.1 + - @backstage/errors@1.1.4-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- d6dbf1792b: Added `lifecycleFactory` implementation. +- Updated dependencies + - @backstage/backend-common@0.16.1-next.0 + - @backstage/plugin-permission-node@0.7.2-next.0 + - @backstage/backend-plugin-api@0.1.5-next.0 + - @backstage/backend-tasks@0.3.8-next.0 + - @backstage/errors@1.1.4-next.0 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0 + - @backstage/backend-tasks@0.3.7 + - @backstage/backend-plugin-api@0.1.4 + - @backstage/plugin-permission-node@0.7.1 + - @backstage/errors@1.1.3 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.1 + - @backstage/backend-plugin-api@0.1.4-next.1 + - @backstage/backend-tasks@0.3.7-next.1 + - @backstage/plugin-permission-node@0.7.1-next.1 + - @backstage/errors@1.1.3-next.0 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.0 + - @backstage/backend-tasks@0.3.7-next.0 + - @backstage/backend-plugin-api@0.1.4-next.0 + - @backstage/plugin-permission-node@0.7.1-next.0 + - @backstage/errors@1.1.3-next.0 + +## 0.2.2 + +### Patch Changes + +- 0027a749cd: Added possibility to configure index plugin of the HTTP router service. +- 45857bffae: Properly export `rootLoggerFactory`. +- Updated dependencies + - @backstage/backend-common@0.15.2 + - @backstage/backend-tasks@0.3.6 + - @backstage/plugin-permission-node@0.7.0 + - @backstage/backend-plugin-api@0.1.3 + - @backstage/errors@1.1.2 + +## 0.2.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.3.6-next.2 + - @backstage/backend-common@0.15.2-next.2 + - @backstage/plugin-permission-node@0.7.0-next.2 + - @backstage/backend-plugin-api@0.1.3-next.2 + - @backstage/errors@1.1.2-next.2 + +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.1 + - @backstage/backend-plugin-api@0.1.3-next.1 + - @backstage/backend-tasks@0.3.6-next.1 + - @backstage/errors@1.1.2-next.1 + - @backstage/plugin-permission-node@0.6.6-next.1 + +## 0.2.2-next.0 + +### Patch Changes + +- 0027a749cd: Added possibility to configure index plugin of the HTTP router service. +- 45857bffae: Properly export `rootLoggerFactory`. +- Updated dependencies + - @backstage/backend-plugin-api@0.1.3-next.0 + - @backstage/backend-common@0.15.2-next.0 + - @backstage/backend-tasks@0.3.6-next.0 + - @backstage/plugin-permission-node@0.6.6-next.0 + - @backstage/errors@1.1.2-next.0 + +## 0.2.1 + +### Patch Changes + +- 2c57c0c499: Made `ApiRef.defaultFactory` internal. +- 854ba37357: Updated to support new `ServiceFactory` formats. +- af6bb42c68: Updated `ServiceRegistry` to not initialize factories more than once. +- 409ed984e8: Updated service implementations and backend wiring to support scoped service. +- de3347ca74: Updated usages of `ServiceFactory`. +- 1f384c5644: Improved error messaging when failing to instantiate services. +- Updated dependencies + - @backstage/backend-plugin-api@0.1.2 + - @backstage/backend-common@0.15.1 + - @backstage/plugin-permission-node@0.6.5 + - @backstage/backend-tasks@0.3.5 + - @backstage/errors@1.1.1 + +## 0.2.1-next.2 + +### Patch Changes + +- 854ba37357: Updated to support new `ServiceFactory` formats. +- 409ed984e8: Updated service implementations and backend wiring to support scoped service. +- Updated dependencies + - @backstage/backend-plugin-api@0.1.2-next.2 + - @backstage/errors@1.1.1-next.0 + - @backstage/backend-common@0.15.1-next.3 + - @backstage/backend-tasks@0.3.5-next.1 + - @backstage/plugin-permission-node@0.6.5-next.3 + +## 0.2.1-next.1 + +### Patch Changes + +- 2c57c0c499: Made `ApiRef.defaultFactory` internal. +- af6bb42c68: Updated `ServiceRegistry` to not initialize factories more than once. +- 1f384c5644: Improved error messaging when failing to instantiate services. +- Updated dependencies + - @backstage/backend-plugin-api@0.1.2-next.1 + - @backstage/backend-common@0.15.1-next.2 + - @backstage/plugin-permission-node@0.6.5-next.2 + +## 0.2.1-next.0 + +### Patch Changes + +- de3347ca74: Updated usages of `ServiceFactory`. +- Updated dependencies + - @backstage/backend-common@0.15.1-next.0 + - @backstage/backend-tasks@0.3.5-next.0 + - @backstage/backend-plugin-api@0.1.2-next.0 + - @backstage/plugin-permission-node@0.6.5-next.0 + +## 0.2.0 + +### Minor Changes + +- 5df230d48c: Introduced a new `backend-defaults` package carrying `createBackend` which was previously exported from `backend-app-api`. + The `backend-app-api` package now exports the `createSpecializedBacked` that does not add any service factories by default. + +### Patch Changes + +- 0599732ec0: Refactored experimental backend system with new type names. +- Updated dependencies + - @backstage/backend-common@0.15.0 + - @backstage/backend-plugin-api@0.1.1 + - @backstage/backend-tasks@0.3.4 + - @backstage/plugin-permission-node@0.6.4 + +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0-next.0 + - @backstage/backend-tasks@0.3.4-next.0 + - @backstage/backend-plugin-api@0.1.1-next.0 + - @backstage/plugin-permission-node@0.6.4-next.0 + +## 0.1.0 + +### Minor Changes + +- 91c1d12123: Add initial plumbing for creating backends using the experimental backend framework. + + This package is highly **EXPERIMENTAL** and should not be used in production. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.1.0 + - @backstage/backend-common@0.14.1 + - @backstage/plugin-permission-node@0.6.3 + - @backstage/backend-tasks@0.3.3 + +## 0.1.0-next.0 + +### Minor Changes + +- 91c1d12123: Add initial plumbing for creating backends using the experimental backend framework. + + This package is highly **EXPERIMENTAL** and should not be used in production. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.1.0-next.0 + - @backstage/backend-common@0.14.1-next.3 + - @backstage/plugin-permission-node@0.6.3-next.2 + - @backstage/backend-tasks@0.3.3-next.3 + +## @backstage/frontend-app-api@0.7.0-next.2 + +### Minor Changes + +- ddddecb: Extensions in app-config now always affect ordering. Previously, only when enabling disabled extensions did they rise to the top. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.7-next.2 + - @backstage/frontend-plugin-api@0.6.5-next.1 + +## @backstage/integration@1.11.0-next.0 + +### Minor Changes + +- 2cc750d: Added `HarnessIntegration` via the `ScmIntegrations` interface. + +## @backstage/repo-tools@0.9.0-next.2 + +### Minor Changes + +- 683870a: Adds 2 new commands `repo schema openapi diff` and `package schema openapi diff`. `repo schema openapi diff` is intended to power a new breaking changes check on pull requests and the package level command allows plugin developers to quickly see new API breaking changes. They're intended to be used in complement with the existing `repo schema openapi verify` command to validate your OpenAPI spec against a variety of things. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + +## @backstage/plugin-catalog@1.20.0-next.2 + +### Minor Changes + +- 8834daf: Updated the presentation API to return a promise, in addition to the snapshot and observable that were there before. This makes it much easier to consume the API in a non-React context. + +### Patch Changes + +- 4118530: Avoiding pre-loading display total count undefined for table counts +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/plugin-search-react@1.7.11-next.1 + - @backstage/integration-react@1.1.27-next.0 + +## @backstage/plugin-catalog-backend@1.22.0-next.2 + +### Minor Changes + +- f2a2a83: Deprecated the `LocationAnalyzer` type, which has been moved to `@backstage/plugin-catalog-node`. +- f2a2a83: The `/alpha` plugin export has had its implementation of the `catalogAnalysisExtensionPoint` updated to reflect the new API. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.24-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-catalog-node@1.12.0-next.2 + +### Minor Changes + +- f2a2a83: Added `LocationAnalyzer` type, moved from `@backstage/plugin-catalog-backend`. +- f2a2a83: Breaking change to `/alpha` API where the `catalogAnalysisExtensionPoint` has been reworked. The `addLocationAnalyzer` method has been renamed to `addScmLocationAnalyzer`, and a new `setLocationAnalyzer` method has been added which allows the full `LocationAnalyzer` implementation to be overridden. + +## @backstage/plugin-catalog-react@1.12.0-next.2 + +### Minor Changes + +- 8834daf: Updated the presentation API to return a promise, in addition to the snapshot and observable that were there before. This makes it much easier to consume the API in a non-React context. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.7-next.2 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/integration-react@1.1.27-next.0 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.4.0-next.2 + +### Minor Changes + +- 18f736f: Add examples for `gitlab:projectVariable:create` scaffolder action & improve related tests + +### Patch Changes + +- 8fa8a00: Add merge method and squash option for project creation +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/backend-common@0.22.0-next.2 + +### Patch Changes + +- 2cc750d: Added `HarnessURLReader` with `readUrl` support. +- ccc8851: Added config prop `ensureSchemaExists` to support postgres instances where user can create schemas but not databases. +- Updated dependencies + - @backstage/integration@1.11.0-next.0 + +## @backstage/backend-defaults@0.2.18-next.2 + +### Patch Changes + +- 7e5a50d: added `eventsServiceFactory` to `defaultServiceFactories` to resolve issue where different instances of the EventsServices could be used +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + +## @backstage/backend-dynamic-feature-service@0.2.10-next.2 + +### Patch Changes + +- b192752: Updated `README.md` to point to `packages/backend` instead of `packages/backend-next`. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.22.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + +## @backstage/backend-test-utils@0.3.8-next.2 + +### Patch Changes + +- 7e5a50d: added `eventsServiceFactory` to `defaultServiceFactories` to resolve issue where different instances of the EventsServices could be used +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + +## @backstage/cli@0.26.5-next.1 + +### Patch Changes + +- 2a6f10d: The `versions:bump` command will no longer exit with a non-zero status if the version bump fails due to forbidden duplicate package installations. It will now also provide more information about how to troubleshoot such an error. The set of forbidden duplicates has also been expanded to include all `@backstage/*-app-api` packages. +- c5d7b40: Allow passing a `--require` argument through to the Node process during `package start` +- cc3c518: Fixed an issue causing the `repo fix` command to set an incorrect `workspace` property using Windows +- 812dff0: Add previously-missing semicolon in file templated by `backstage-cli new --select plugin`. +- Updated dependencies + - @backstage/integration@1.11.0-next.0 + +## @backstage/core-components@0.14.7-next.2 + +### Patch Changes + +- a2ee4df: Add `alignGauge` prop to the `GaugeCard`, and a small size version. When `alignGauge` is `'bottom'` the gauge will vertically align the gauge in the cards, even when the card titles span across multiple lines. + Add `alignContent` prop to the `InfoCard`, defaulting to `'normal'` with the option of `'bottom'` which vertically aligns the content to the bottom of the card. + +## @backstage/create-app@0.5.15-next.2 + +### Patch Changes + +- Bumped create-app version. + +## @backstage/dev-utils@1.0.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/integration-react@1.1.27-next.0 + +## @backstage/frontend-test-utils@0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.7.0-next.2 + - @backstage/frontend-plugin-api@0.6.5-next.1 + +## @backstage/integration-react@1.1.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-api-docs@0.11.5-next.2 + +### Patch Changes + +- 725ff0b: Fix dark mode text color inside tables in `description:` from OpenAPI definitions +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/plugin-catalog@1.20.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + +## @backstage/plugin-auth-backend@0.22.5-next.2 + +### Patch Changes + +- 4a0577e: fix: Move config declarations to appropriate auth backend modules +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.1.10-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.1.15-next.2 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.1.10-next.2 + +### Patch Changes + +- 4a0577e: fix: Move config declarations to appropriate auth backend modules +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-auth-backend@0.22.5-next.2 + +## @backstage/plugin-auth-backend-module-github-provider@0.1.15-next.2 + +### Patch Changes + +- 4a0577e: fix: Move config declarations to appropriate auth backend modules + +## @backstage/plugin-bitbucket-cloud-common@0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.3.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-catalog-backend-module-azure@0.1.38-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.19-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.6.1-next.2 + +### Patch Changes + +- 0b50143: GitHub push events now schedule a refresh on entities that have a `refresh_key` matching the `catalogPath` config itself. + This allows to support a `catalogPath` configuration that uses glob patterns. +- f2a2a83: Updated to use the new `catalogAnalysisExtensionPoint` API. +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/plugin-catalog-backend@1.22.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-catalog-backend-module-github-org@0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-catalog-backend-module-github@0.6.1-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + +## @backstage/plugin-catalog-backend-module-gitlab@0.3.15-next.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.0.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/plugin-catalog-backend-module-gitlab@0.3.15-next.4 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.4.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/plugin-catalog-backend@1.22.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/plugin-catalog-backend@1.22.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.2 + +### Patch Changes + +- b192752: Updated `README.md` to point to `packages/backend` instead of `packages/backend-next`. +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + +## @backstage/plugin-catalog-graph@0.4.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + +## @backstage/plugin-catalog-import@0.10.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/integration-react@1.1.27-next.0 + +## @backstage/plugin-devtools-backend@0.3.4-next.2 + +### Patch Changes + +- 036feca: Added discovery property to the readme documentation to ensure that it will build when setting it up as new to a Backstage instance +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + +## @backstage/plugin-events-node@0.3.4-next.2 + +### Patch Changes + +- 7e5a50d: added `eventsServiceFactory` to `defaultServiceFactories` to resolve issue where different instances of the EventsServices could be used + +## @backstage/plugin-home@0.7.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + +## @backstage/plugin-kubernetes@0.11.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + +## @backstage/plugin-kubernetes-backend@0.17.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + +## @backstage/plugin-kubernetes-cluster@0.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + +## @backstage/plugin-notifications@0.2.1-next.2 + +### Patch Changes + +- 42eaf63: Increase default and allow modifying notification snackbar auto hide duration +- Updated dependencies + - @backstage/core-components@0.14.7-next.2 + +## @backstage/plugin-notifications-backend@0.2.1-next.2 + +### Patch Changes + +- d541ff6: Fixed email processor `esm` issue and config reading +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + +## @backstage/plugin-notifications-backend-module-email@0.0.1-next.1 + +### Patch Changes + +- d541ff6: Fixed email processor `esm` issue and config reading +- e538b10: Support relative links in notifications sent via email +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + +## @backstage/plugin-org@0.6.25-next.2 + +### Patch Changes + +- 99e6105: Fix ownership card sometimes locking up for complex org structures +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + +## @backstage/plugin-org-react@0.1.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + +## @backstage/plugin-scaffolder@1.19.4-next.2 + +### Patch Changes + +- 762141c: Fixed a bug where the `MultiEntityPicker` was not able to be set as required +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/plugin-scaffolder-react@1.8.5-next.2 + - @backstage/integration-react@1.1.27-next.0 + +## @backstage/plugin-scaffolder-backend@1.22.6-next.2 + +### Patch Changes + +- e4b50ab: Scaffolder workspace serialization +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.4.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.2 + - @backstage/plugin-scaffolder-backend-module-azure@0.1.10-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.2.8-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.8-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.8-next.2 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.1.10-next.2 + - @backstage/plugin-scaffolder-backend-module-gitea@0.1.8-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.2.8-next.2 + +## @backstage/plugin-scaffolder-backend-module-azure@0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.8-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.8-next.2 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.42-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-scaffolder-backend-module-github@0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.0.1-next.0 + +### Patch Changes + +- 503d769: Add a new scaffolder action to allow sending notifications from templates +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-scaffolder-node@0.4.4-next.2 + +### Patch Changes + +- e4b50ab: Scaffolder workspace serialization +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-scaffolder-react@1.8.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + +## @backstage/plugin-search@1.4.11-next.2 + +### Patch Changes + +- 0501243: Added `aria-label` attribute to DialogTitle element and set `aria-modal` attribute to `true` for improved accessibility in the search modal. +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/plugin-search-react@1.7.11-next.1 + +## @backstage/plugin-search-backend@1.5.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/repo-tools@0.9.0-next.2 + +## @backstage/plugin-search-backend-module-catalog@0.1.24-next.2 + +### Patch Changes + +- b192752: Updated `README.md` to point to `packages/backend` instead of `packages/backend-next`. +- 5dc5f4f: Allow the `tokenManager` parameter to be optional when instantiating collator +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + +## @backstage/plugin-search-backend-module-techdocs@0.1.23-next.2 + +### Patch Changes + +- 5dc5f4f: Allow the `tokenManager` parameter to be optional when instantiating collator +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-techdocs-node@1.12.4-next.2 + +## @backstage/plugin-signals-backend@0.1.4-next.2 + +### Patch Changes + +- 845d56a: Improved signal lifecycle management and added server side pinging of connections +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + +## @backstage/plugin-techdocs@1.10.5-next.2 + +### Patch Changes + +- 5863cf7: The `techdocs.builder` config is now optional and it will default to `local`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/plugin-search-react@1.7.11-next.1 + - @backstage/integration-react@1.1.27-next.0 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.10.5-next.2 + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/plugin-catalog@1.20.0-next.2 + - @backstage/plugin-search-react@1.7.11-next.1 + - @backstage/integration-react@1.1.27-next.0 + +## @backstage/plugin-techdocs-backend@1.10.5-next.2 + +### Patch Changes + +- 5863cf7: The `techdocs.builder` config is now optional and it will default to `local`. +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.2 + - @backstage/plugin-techdocs-node@1.12.4-next.2 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.7-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/integration-react@1.1.27-next.0 + +## @backstage/plugin-techdocs-node@1.12.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + +## @backstage/plugin-user-settings@0.8.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + +## example-app@0.2.97-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.26.5-next.1 + - @backstage/frontend-app-api@0.7.0-next.2 + - @backstage/plugin-techdocs@1.10.5-next.2 + - @backstage/plugin-notifications@0.2.1-next.2 + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/plugin-catalog@1.20.0-next.2 + - @backstage/plugin-api-docs@0.11.5-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/plugin-scaffolder@1.19.4-next.2 + - @backstage/plugin-search@1.4.11-next.2 + - @backstage/plugin-org@0.6.25-next.2 + - @backstage/plugin-search-react@1.7.11-next.1 + - @backstage/plugin-catalog-graph@0.4.5-next.2 + - @backstage/plugin-catalog-import@0.10.11-next.2 + - @backstage/plugin-home@0.7.4-next.2 + - @backstage/plugin-kubernetes@0.11.10-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.11-next.2 + - @backstage/plugin-scaffolder-react@1.8.5-next.2 + - @backstage/plugin-user-settings@0.8.6-next.2 + - @backstage/integration-react@1.1.27-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.10-next.2 + +## example-app-next@0.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.26.5-next.1 + - @backstage/frontend-app-api@0.7.0-next.2 + - @backstage/plugin-techdocs@1.10.5-next.2 + - @backstage/plugin-notifications@0.2.1-next.2 + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/plugin-catalog@1.20.0-next.2 + - @backstage/plugin-api-docs@0.11.5-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/plugin-scaffolder@1.19.4-next.2 + - @backstage/plugin-search@1.4.11-next.2 + - @backstage/plugin-org@0.6.25-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/plugin-search-react@1.7.11-next.1 + - @backstage/plugin-catalog-graph@0.4.5-next.2 + - @backstage/plugin-catalog-import@0.10.11-next.2 + - @backstage/plugin-home@0.7.4-next.2 + - @backstage/plugin-kubernetes@0.11.10-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.11-next.2 + - @backstage/plugin-scaffolder-react@1.8.5-next.2 + - @backstage/plugin-user-settings@0.8.6-next.2 + - @backstage/integration-react@1.1.27-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.10-next.2 + +## example-backend-legacy@0.2.98-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.24-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.4.0-next.2 + - @backstage/plugin-catalog-backend@1.22.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-devtools-backend@0.3.4-next.2 + - @backstage/plugin-scaffolder-backend@1.22.6-next.2 + - @backstage/plugin-signals-backend@0.1.4-next.2 + - @backstage/plugin-auth-backend@0.22.5-next.2 + - @backstage/plugin-techdocs-backend@1.10.5-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.2 + - @backstage/plugin-kubernetes-backend@0.17.1-next.2 + - @backstage/plugin-search-backend@1.5.8-next.2 + - example-app@0.2.97-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.19-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.35-next.2 + +## techdocs-cli-embedded-app@0.2.96-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.26.5-next.1 + - @backstage/plugin-techdocs@1.10.5-next.2 + - @backstage/plugin-catalog@1.20.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/integration-react@1.1.27-next.0 diff --git a/package.json b/package.json index 45bc0a2973..8611c9d59b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.27.0-next.1", + "version": "1.27.0-next.2", "private": true, "repository": { "type": "git", diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md index ab2c13c42a..890f1ca20b 100644 --- a/packages/app-next/CHANGELOG.md +++ b/packages/app-next/CHANGELOG.md @@ -1,5 +1,34 @@ # example-app-next +## 0.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.26.5-next.1 + - @backstage/frontend-app-api@0.7.0-next.2 + - @backstage/plugin-techdocs@1.10.5-next.2 + - @backstage/plugin-notifications@0.2.1-next.2 + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/plugin-catalog@1.20.0-next.2 + - @backstage/plugin-api-docs@0.11.5-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/plugin-scaffolder@1.19.4-next.2 + - @backstage/plugin-search@1.4.11-next.2 + - @backstage/plugin-org@0.6.25-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/plugin-search-react@1.7.11-next.1 + - @backstage/plugin-catalog-graph@0.4.5-next.2 + - @backstage/plugin-catalog-import@0.10.11-next.2 + - @backstage/plugin-home@0.7.4-next.2 + - @backstage/plugin-kubernetes@0.11.10-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.11-next.2 + - @backstage/plugin-scaffolder-react@1.8.5-next.2 + - @backstage/plugin-user-settings@0.8.6-next.2 + - @backstage/integration-react@1.1.27-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.10-next.2 + ## 0.0.11-next.1 ### Patch Changes diff --git a/packages/app-next/package.json b/packages/app-next/package.json index d41ff02488..d7b286e0fa 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -1,6 +1,6 @@ { "name": "example-app-next", - "version": "0.0.11-next.1", + "version": "0.0.11-next.2", "private": true, "repository": { "type": "git", diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 12e71ba6c0..3b8d6ca936 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,32 @@ # example-app +## 0.2.97-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.26.5-next.1 + - @backstage/frontend-app-api@0.7.0-next.2 + - @backstage/plugin-techdocs@1.10.5-next.2 + - @backstage/plugin-notifications@0.2.1-next.2 + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/plugin-catalog@1.20.0-next.2 + - @backstage/plugin-api-docs@0.11.5-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/plugin-scaffolder@1.19.4-next.2 + - @backstage/plugin-search@1.4.11-next.2 + - @backstage/plugin-org@0.6.25-next.2 + - @backstage/plugin-search-react@1.7.11-next.1 + - @backstage/plugin-catalog-graph@0.4.5-next.2 + - @backstage/plugin-catalog-import@0.10.11-next.2 + - @backstage/plugin-home@0.7.4-next.2 + - @backstage/plugin-kubernetes@0.11.10-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.11-next.2 + - @backstage/plugin-scaffolder-react@1.8.5-next.2 + - @backstage/plugin-user-settings@0.8.6-next.2 + - @backstage/integration-react@1.1.27-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.10-next.2 + ## 0.2.97-next.1 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 20d0d0312f..13466e1b41 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.97-next.1", + "version": "0.2.97-next.2", "backstage": { "role": "frontend" }, diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index bb53e78ff1..f188b4aa51 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-app-api", - "version": "0.7.2-next.1", + "version": "0.7.3-next.1", "description": "Core API used by Backstage backend apps", "backstage": { "role": "node-library" diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index c8e459ba78..3ab27aa3bf 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-common +## 0.22.0-next.2 + +### Patch Changes + +- 2cc750d: Added `HarnessURLReader` with `readUrl` support. +- ccc8851: Added config prop `ensureSchemaExists` to support postgres instances where user can create schemas but not databases. +- Updated dependencies + - @backstage/integration@1.11.0-next.0 + ## 0.22.0-next.1 ### Minor Changes diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 42c4c49863..52ae56cff4 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-common", - "version": "0.22.0-next.1", + "version": "0.22.0-next.2", "description": "Common functionality library for Backstage backends", "backstage": { "role": "node-library" diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index a9871d0aa5..11a9e78a18 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-defaults +## 0.2.18-next.2 + +### Patch Changes + +- 7e5a50d: added `eventsServiceFactory` to `defaultServiceFactories` to resolve issue where different instances of the EventsServices could be used +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + ## 0.2.18-next.1 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 69394ef5ba..ec26ec6471 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-defaults", "description": "Backend defaults used by Backstage backend apps", - "version": "0.2.18-next.1", + "version": "0.2.18-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-dynamic-feature-service/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md index f45e57bd9c..a0f08195b1 100644 --- a/packages/backend-dynamic-feature-service/CHANGELOG.md +++ b/packages/backend-dynamic-feature-service/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/backend-dynamic-feature-service +## 0.2.10-next.2 + +### Patch Changes + +- b192752: Updated `README.md` to point to `packages/backend` instead of `packages/backend-next`. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.22.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + ## 0.2.10-next.1 ### Patch Changes diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json index 35d053d40a..715ca5f44d 100644 --- a/packages/backend-dynamic-feature-service/package.json +++ b/packages/backend-dynamic-feature-service/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-dynamic-feature-service", "description": "Backstage dynamic feature service", - "version": "0.2.10-next.1", + "version": "0.2.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-legacy/CHANGELOG.md b/packages/backend-legacy/CHANGELOG.md index f6d199c6df..c4a59512e5 100644 --- a/packages/backend-legacy/CHANGELOG.md +++ b/packages/backend-legacy/CHANGELOG.md @@ -1,5 +1,31 @@ # example-backend-legacy +## 0.2.98-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/plugin-catalog-backend-module-unprocessed@0.4.5-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.24-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.4.0-next.2 + - @backstage/plugin-catalog-backend@1.22.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-devtools-backend@0.3.4-next.2 + - @backstage/plugin-scaffolder-backend@1.22.6-next.2 + - @backstage/plugin-signals-backend@0.1.4-next.2 + - @backstage/plugin-auth-backend@0.22.5-next.2 + - @backstage/plugin-techdocs-backend@1.10.5-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.2 + - @backstage/plugin-kubernetes-backend@0.17.1-next.2 + - @backstage/plugin-search-backend@1.5.8-next.2 + - example-app@0.2.97-next.2 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.19-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.35-next.2 + ## 0.2.98-next.1 ### Patch Changes diff --git a/packages/backend-legacy/package.json b/packages/backend-legacy/package.json index 47c04f9a3c..799387f5d2 100644 --- a/packages/backend-legacy/package.json +++ b/packages/backend-legacy/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-legacy", - "version": "0.2.98-next.1", + "version": "0.2.98-next.2", "backstage": { "role": "backend" }, diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 6602f4cbe8..aafed2071e 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-test-utils +## 0.3.8-next.2 + +### Patch Changes + +- 7e5a50d: added `eventsServiceFactory` to `defaultServiceFactories` to resolve issue where different instances of the EventsServices could be used +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + ## 0.3.8-next.1 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index fca8ef5c01..f9d591e470 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-test-utils", - "version": "0.3.8-next.1", + "version": "0.3.8-next.2", "description": "Test helpers library for Backstage backends", "backstage": { "role": "node-library" diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 6c37772f73..804966ba3b 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/cli +## 0.26.5-next.1 + +### Patch Changes + +- 2a6f10d: The `versions:bump` command will no longer exit with a non-zero status if the version bump fails due to forbidden duplicate package installations. It will now also provide more information about how to troubleshoot such an error. The set of forbidden duplicates has also been expanded to include all `@backstage/*-app-api` packages. +- c5d7b40: Allow passing a `--require` argument through to the Node process during `package start` +- cc3c518: Fixed an issue causing the `repo fix` command to set an incorrect `workspace` property using Windows +- 812dff0: Add previously-missing semicolon in file templated by `backstage-cli new --select plugin`. +- Updated dependencies + - @backstage/integration@1.11.0-next.0 + ## 0.26.5-next.0 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index c8baae4d4d..d6fe116248 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli", - "version": "0.26.5-next.0", + "version": "0.26.5-next.1", "description": "CLI for developing Backstage plugins and apps", "backstage": { "role": "cli" diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 2c6d4ea490..dc31cb9f4d 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/core-components +## 0.14.7-next.2 + +### Patch Changes + +- a2ee4df: Add `alignGauge` prop to the `GaugeCard`, and a small size version. When `alignGauge` is `'bottom'` the gauge will vertically align the gauge in the cards, even when the card titles span across multiple lines. + Add `alignContent` prop to the `InfoCard`, defaulting to `'normal'` with the option of `'bottom'` which vertically aligns the content to the bottom of the card. + ## 0.14.6-next.1 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 87f51dff26..014059b89b 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-components", "description": "Core components used by Backstage plugins and apps", - "version": "0.14.6-next.1", + "version": "0.14.7-next.2", "publishConfig": { "access": "public" }, diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index c6338c7243..b301828207 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/create-app +## 0.5.15-next.2 + +### Patch Changes + +- Bumped create-app version. + ## 0.5.15-next.1 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 72d8e00045..ec0e764fff 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.5.15-next.1", + "version": "0.5.15-next.2", "publishConfig": { "access": "public" }, diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index e4622aab60..673ee43d24 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/dev-utils +## 1.0.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/integration-react@1.1.27-next.0 + ## 1.0.32-next.1 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index bac82890d0..f6308b6446 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/dev-utils", - "version": "1.0.32-next.1", + "version": "1.0.32-next.2", "description": "Utilities for developing Backstage plugins.", "backstage": { "role": "web-library" diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md index 0ac06f4393..c560948cc2 100644 --- a/packages/frontend-app-api/CHANGELOG.md +++ b/packages/frontend-app-api/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/frontend-app-api +## 0.7.0-next.2 + +### Minor Changes + +- ddddecb: Extensions in app-config now always affect ordering. Previously, only when enabling disabled extensions did they rise to the top. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.7-next.2 + - @backstage/frontend-plugin-api@0.6.5-next.1 + ## 0.6.5-next.1 ### Patch Changes diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 65045bc6ab..7602f688ef 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-app-api", - "version": "0.6.5-next.1", + "version": "0.7.0-next.2", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md index 79d54b2f29..0d41932eb0 100644 --- a/packages/frontend-test-utils/CHANGELOG.md +++ b/packages/frontend-test-utils/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/frontend-test-utils +## 0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.7.0-next.2 + - @backstage/frontend-plugin-api@0.6.5-next.1 + ## 0.1.7-next.1 ### Patch Changes diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index af83141368..44eddc2ada 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-test-utils", - "version": "0.1.7-next.1", + "version": "0.1.7-next.2", "backstage": { "role": "web-library" }, diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index b12e621a60..33de746f92 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/integration-react +## 1.1.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.11.0-next.0 + ## 1.1.26 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index c77bd26f27..5d87ccaa13 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-react", - "version": "1.1.26", + "version": "1.1.27-next.0", "description": "Frontend package for managing integrations towards external systems", "backstage": { "role": "web-library" diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index 8a4616bfd7..0ed0080b10 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/integration +## 1.11.0-next.0 + +### Minor Changes + +- 2cc750d: Added `HarnessIntegration` via the `ScmIntegrations` interface. + ## 1.10.0 ### Minor Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index bbd0eecbe7..ad41e216a7 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration", - "version": "1.10.0", + "version": "1.11.0-next.0", "description": "Helpers for managing integrations towards external systems", "backstage": { "role": "common-library" diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 443a5f30b5..b3aefc9e67 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/repo-tools +## 0.9.0-next.2 + +### Minor Changes + +- 683870a: Adds 2 new commands `repo schema openapi diff` and `package schema openapi diff`. `repo schema openapi diff` is intended to power a new breaking changes check on pull requests and the package level command allows plugin developers to quickly see new API breaking changes. They're intended to be used in complement with the existing `repo schema openapi verify` command to validate your OpenAPI spec against a variety of things. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + ## 0.8.1-next.1 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index e39e5203b7..14a2cbca1d 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/repo-tools", "description": "CLI for Backstage repo tooling ", - "version": "0.8.1-next.1", + "version": "0.9.0-next.2", "publishConfig": { "access": "public" }, diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 99853ed312..cd27b1c1a7 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,16 @@ # techdocs-cli-embedded-app +## 0.2.96-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.26.5-next.1 + - @backstage/plugin-techdocs@1.10.5-next.2 + - @backstage/plugin-catalog@1.20.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/integration-react@1.1.27-next.0 + ## 0.2.96-next.1 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index ce19840c56..687a469914 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.96-next.1", + "version": "0.2.96-next.2", "private": true, "backstage": { "role": "frontend" diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index faac54a107..39613bd409 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-api-docs +## 0.11.5-next.2 + +### Patch Changes + +- 725ff0b: Fix dark mode text color inside tables in `description:` from OpenAPI definitions +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/plugin-catalog@1.20.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + ## 0.11.5-next.1 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index c8acdf256f..4b8ff68d86 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-api-docs", - "version": "0.11.5-next.1", + "version": "0.11.5-next.2", "description": "A Backstage plugin that helps represent API entities in the frontend", "backstage": { "role": "frontend-plugin" diff --git a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md index 0b2fa1faf0..784334ac96 100644 --- a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-aws-alb-provider +## 0.1.10-next.2 + +### Patch Changes + +- 4a0577e: fix: Move config declarations to appropriate auth backend modules +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-auth-backend@0.22.5-next.2 + ## 0.1.10-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-aws-alb-provider/package.json b/plugins/auth-backend-module-aws-alb-provider/package.json index ae25459ccc..86d4793d81 100644 --- a/plugins/auth-backend-module-aws-alb-provider/package.json +++ b/plugins/auth-backend-module-aws-alb-provider/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend-module-aws-alb-provider", "description": "The aws-alb provider module for the Backstage auth backend.", - "version": "0.1.10-next.1", + "version": "0.1.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend-module-github-provider/CHANGELOG.md b/plugins/auth-backend-module-github-provider/CHANGELOG.md index c9da8b5970..32ea1205d9 100644 --- a/plugins/auth-backend-module-github-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-github-provider/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-auth-backend-module-github-provider +## 0.1.15-next.2 + +### Patch Changes + +- 4a0577e: fix: Move config declarations to appropriate auth backend modules + ## 0.1.15-next.1 ### Patch Changes diff --git a/plugins/auth-backend-module-github-provider/package.json b/plugins/auth-backend-module-github-provider/package.json index 0e8db4d1a5..3f587ad033 100644 --- a/plugins/auth-backend-module-github-provider/package.json +++ b/plugins/auth-backend-module-github-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-github-provider", - "version": "0.1.15-next.1", + "version": "0.1.15-next.2", "description": "The github-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index aa33d39713..59a7aa4af0 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-auth-backend +## 0.22.5-next.2 + +### Patch Changes + +- 4a0577e: fix: Move config declarations to appropriate auth backend modules +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-auth-backend-module-aws-alb-provider@0.1.10-next.2 + - @backstage/plugin-auth-backend-module-github-provider@0.1.15-next.2 + ## 0.22.5-next.1 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 372b8f8d4b..910c7d4180 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend", - "version": "0.22.5-next.1", + "version": "0.22.5-next.2", "description": "A Backstage backend plugin that handles authentication", "backstage": { "role": "backend-plugin" diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index 64ffaa12dd..1397e67af4 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.11.0-next.0 + ## 0.2.18 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index 41ba69be10..dba2dbc40f 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", - "version": "0.2.18", + "version": "0.2.19-next.0", "description": "Common functionalities for bitbucket-cloud plugins", "backstage": { "role": "common-library" diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index be6e743eb9..f0e0b8e6aa 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.3.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.3.13-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index fbc4122fe2..d80383a18f 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", - "version": "0.3.13-next.1", + "version": "0.3.13-next.2", "description": "A Backstage catalog backend module that helps integrate towards AWS", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 5b7751dc03..6d3af364bb 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.38-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.1.38-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 4df7824fa7..a0a7edb728 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", - "version": "0.1.38-next.1", + "version": "0.1.38-next.2", "description": "A Backstage catalog backend module that helps integrate towards Azure", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md index 449c016837..fc48605090 100644 --- a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-backend-module-backstage-openapi +## 0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + ## 0.2.1-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-backstage-openapi/package.json b/plugins/catalog-backend-module-backstage-openapi/package.json index 86c7bb02e7..408fdfcc4f 100644 --- a/plugins/catalog-backend-module-backstage-openapi/package.json +++ b/plugins/catalog-backend-module-backstage-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-backstage-openapi", - "version": "0.2.1-next.1", + "version": "0.2.1-next.2", "backstage": { "role": "backend-plugin-module" }, diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index a40ceb8254..8884d911d3 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.2.19-next.0 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index f6b4620671..a6554c173a 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.2.5-next.1", + "version": "0.2.5-next.2", "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 153494a358..424f143da1 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.1.32-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index e46d0107a5..e1b0e4c362 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.32-next.1", + "version": "0.1.32-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md index 18299d760a..095366892f 100644 --- a/plugins/catalog-backend-module-gcp/CHANGELOG.md +++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-catalog-backend-module-gcp +## 0.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + ## 0.1.19-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json index c58c014b0e..758a909b3c 100644 --- a/plugins/catalog-backend-module-gcp/package.json +++ b/plugins/catalog-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gcp", - "version": "0.1.19-next.1", + "version": "0.1.19-next.2", "description": "A Backstage catalog backend module that helps integrate towards GCP", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 8b5e5edd96..3aaa06ae02 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.1.35-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index c436a07263..f58d6bb85f 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.35-next.1", + "version": "0.1.35-next.2", "backstage": { "role": "backend-plugin-module" }, diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md index b1fd9b17d7..01a6fb3b7a 100644 --- a/plugins/catalog-backend-module-github-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-github-org/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-github-org +## 0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-catalog-backend-module-github@0.6.1-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + ## 0.1.13-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json index 2838396c88..4557cbedef 100644 --- a/plugins/catalog-backend-module-github-org/package.json +++ b/plugins/catalog-backend-module-github-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github-org", - "version": "0.1.13-next.1", + "version": "0.1.13-next.2", "description": "The github-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index 5bb58f25c0..ad4281d185 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-github +## 0.6.1-next.2 + +### Patch Changes + +- 0b50143: GitHub push events now schedule a refresh on entities that have a `refresh_key` matching the `catalogPath` config itself. + This allows to support a `catalogPath` configuration that uses glob patterns. +- f2a2a83: Updated to use the new `catalogAnalysisExtensionPoint` API. +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/plugin-catalog-backend@1.22.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.6.1-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 47a32566af..05306549c3 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github", - "version": "0.6.1-next.1", + "version": "0.6.1-next.2", "description": "A Backstage catalog backend module that helps integrate towards GitHub", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md index fa0b9f2a24..4926c5efc4 100644 --- a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-gitlab-org +## 0.0.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/plugin-catalog-backend-module-gitlab@0.3.15-next.4 + ## 0.0.1-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab-org/package.json b/plugins/catalog-backend-module-gitlab-org/package.json index c2d524d9d8..e0eb268ba6 100644 --- a/plugins/catalog-backend-module-gitlab-org/package.json +++ b/plugins/catalog-backend-module-gitlab-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab-org", - "version": "0.0.1-next.1", + "version": "0.0.1-next.2", "description": "The gitlab-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 5b36f2570b..661d422547 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.3.15-next.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.3.15-next.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index d0d3c876ae..c485326f3e 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -72,5 +72,5 @@ ] } }, - "version": "0.3.15-next.3" + "version": "0.3.15-next.4" } diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index 2f4505abba..961ebe081c 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.4.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/plugin-catalog-backend@1.22.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + ## 0.4.23-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 6c9f930d33..0a4f73c5d4 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", - "version": "0.4.23-next.1", + "version": "0.4.23-next.2", "description": "An entity provider for streaming large asset sources into the catalog", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 10a774ffad..22da3d6099 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + ## 0.5.34-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 82558bc6d8..e50d629e0e 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", - "version": "0.5.34-next.1", + "version": "0.5.34-next.2", "description": "A Backstage catalog backend module that helps integrate towards LDAP", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index 8b7dcb9c80..4d6a4bc350 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.5.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + ## 0.5.26-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 7a89b0c507..ddc3ca4af3 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", - "version": "0.5.26-next.1", + "version": "0.5.26-next.2", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index f7303d298e..2b1e0650a8 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.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/plugin-catalog-backend@1.22.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.1.36-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index be2efd8c93..2eb832684d 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", - "version": "0.1.36-next.1", + "version": "0.1.36-next.2", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index b2604c469e..84d705b8be 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.1.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + ## 0.1.24-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index 6c38b658e3..6d3a71092e 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", - "version": "0.1.24-next.1", + "version": "0.1.24-next.2", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md index b7b46ed403..b51aacb4f1 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md +++ b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-backend-module-scaffolder-entity-model +## 0.1.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + ## 0.1.16-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/package.json b/plugins/catalog-backend-module-scaffolder-entity-model/package.json index 6b8bc12493..2bf29a3bb3 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/package.json +++ b/plugins/catalog-backend-module-scaffolder-entity-model/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-scaffolder-entity-model", - "version": "0.1.16-next.1", + "version": "0.1.16-next.2", "description": "Adds support for the scaffolder specific entity model (e.g. the Template kind) to the catalog backend plugin.", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md index a53e36a696..1a2e2a2785 100644 --- a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md +++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-unprocessed +## 0.4.5-next.2 + +### Patch Changes + +- b192752: Updated `README.md` to point to `packages/backend` instead of `packages/backend-next`. +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + ## 0.4.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index 38d96e62e9..ba13df5a2a 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-unprocessed", - "version": "0.4.5-next.1", + "version": "0.4.5-next.2", "description": "Backstage Catalog module to view unprocessed entities", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 426333c567..4d8e2f1cd0 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend +## 1.22.0-next.2 + +### Minor Changes + +- f2a2a83: Deprecated the `LocationAnalyzer` type, which has been moved to `@backstage/plugin-catalog-node`. +- f2a2a83: The `/alpha` plugin export has had its implementation of the `catalogAnalysisExtensionPoint` updated to reflect the new API. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/plugin-search-backend-module-catalog@0.1.24-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 1.22.0-next.1 ### Patch Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index cea3f06c6f..f57efe5ae6 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend", - "version": "1.22.0-next.1", + "version": "1.22.0-next.2", "description": "The Backstage backend plugin that provides the Backstage catalog", "backstage": { "role": "backend-plugin" diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index e1b79d8d13..372a94a19c 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-graph +## 0.4.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + ## 0.4.5-next.1 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index d0363f5376..ac9039a441 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.4.5-next.1", + "version": "0.4.5-next.2", "backstage": { "role": "frontend-plugin" }, diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index bfdfabba5a..f201bf7552 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-import +## 0.10.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/integration-react@1.1.27-next.0 + ## 0.10.11-next.1 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index a766110a4d..d5f70964a1 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-import", - "version": "0.10.11-next.1", + "version": "0.10.11-next.2", "description": "A Backstage plugin the helps you import entities into your catalog", "backstage": { "role": "frontend-plugin" diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index a2405a7eef..949a44b384 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-node +## 1.12.0-next.2 + +### Minor Changes + +- f2a2a83: Added `LocationAnalyzer` type, moved from `@backstage/plugin-catalog-backend`. +- f2a2a83: Breaking change to `/alpha` API where the `catalogAnalysisExtensionPoint` has been reworked. The `addLocationAnalyzer` method has been renamed to `addScmLocationAnalyzer`, and a new `setLocationAnalyzer` method has been added which allows the full `LocationAnalyzer` implementation to be overridden. + ## 1.11.2-next.1 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index ebfea63cef..010389079d 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-node", - "version": "1.11.2-next.1", + "version": "1.12.0-next.2", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", "backstage": { "role": "node-library" diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index 190773044a..fe64a6101d 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-react +## 1.12.0-next.2 + +### Minor Changes + +- 8834daf: Updated the presentation API to return a promise, in addition to the snapshot and observable that were there before. This makes it much easier to consume the API in a non-React context. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.7-next.2 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/integration-react@1.1.27-next.0 + ## 1.11.4-next.1 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 041253f223..85b7ba95be 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.11.4-next.1", + "version": "1.12.0-next.2", "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 300083da1c..d20331bbfe 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-catalog +## 1.20.0-next.2 + +### Minor Changes + +- 8834daf: Updated the presentation API to return a promise, in addition to the snapshot and observable that were there before. This makes it much easier to consume the API in a non-React context. + +### Patch Changes + +- 4118530: Avoiding pre-loading display total count undefined for table counts +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/plugin-search-react@1.7.11-next.1 + - @backstage/integration-react@1.1.27-next.0 + ## 1.19.1-next.1 ### Patch Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 207717e1c9..e32191c629 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog", - "version": "1.19.1-next.1", + "version": "1.20.0-next.2", "description": "The Backstage plugin for browsing the Backstage catalog", "backstage": { "role": "frontend-plugin" diff --git a/plugins/devtools-backend/CHANGELOG.md b/plugins/devtools-backend/CHANGELOG.md index 1d4247cb9f..38e0da331f 100644 --- a/plugins/devtools-backend/CHANGELOG.md +++ b/plugins/devtools-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-devtools-backend +## 0.3.4-next.2 + +### Patch Changes + +- 036feca: Added discovery property to the readme documentation to ensure that it will build when setting it up as new to a Backstage instance +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + ## 0.3.4-next.1 ### Patch Changes diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index e9c6f48b49..fd2c8eac4a 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-backend", - "version": "0.3.4-next.1", + "version": "0.3.4-next.2", "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 185da613eb..7238c9ed49 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-events-node +## 0.3.4-next.2 + +### Patch Changes + +- 7e5a50d: added `eventsServiceFactory` to `defaultServiceFactories` to resolve issue where different instances of the EventsServices could be used + ## 0.3.4-next.1 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 7312950a99..9500fdc0ad 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-node", - "version": "0.3.4-next.1", + "version": "0.3.4-next.2", "description": "The plugin-events-node module for @backstage/plugin-events-backend", "backstage": { "role": "node-library" diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 565d82f395..6fb3fbaec9 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-home +## 0.7.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + ## 0.7.4-next.1 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 0058c35e00..63f01e84c4 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home", - "version": "0.7.4-next.1", + "version": "0.7.4-next.2", "description": "A Backstage plugin that helps you build a home page", "backstage": { "role": "frontend-plugin" diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index a1000aea2c..48e205f868 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-kubernetes-backend +## 0.17.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + ## 0.17.1-next.1 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index a8634d8855..24a52bc8a8 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.17.1-next.1", + "version": "0.17.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md index 8ebfd45d77..09adcabc63 100644 --- a/plugins/kubernetes-cluster/CHANGELOG.md +++ b/plugins/kubernetes-cluster/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-kubernetes-cluster +## 0.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + ## 0.0.11-next.1 ### Patch Changes diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 1402c79951..409c385263 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-cluster", - "version": "0.0.11-next.1", + "version": "0.0.11-next.2", "description": "A Backstage plugin that shows details of Kubernetes clusters", "backstage": { "role": "frontend-plugin" diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index de0f70736a..87b1132710 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-kubernetes +## 0.11.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + ## 0.11.10-next.1 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index e75d503558..bfb8ed1e2c 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.11.10-next.1", + "version": "0.11.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/notifications-backend-module-email/CHANGELOG.md b/plugins/notifications-backend-module-email/CHANGELOG.md index 065f8cb533..1c6e150a29 100644 --- a/plugins/notifications-backend-module-email/CHANGELOG.md +++ b/plugins/notifications-backend-module-email/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-notifications-backend-module-email +## 0.0.1-next.1 + +### Patch Changes + +- d541ff6: Fixed email processor `esm` issue and config reading +- e538b10: Support relative links in notifications sent via email +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + ## 0.0.1-next.0 ### Patch Changes diff --git a/plugins/notifications-backend-module-email/package.json b/plugins/notifications-backend-module-email/package.json index bb99d9cb97..1884dc6352 100644 --- a/plugins/notifications-backend-module-email/package.json +++ b/plugins/notifications-backend-module-email/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend-module-email", - "version": "0.0.1-next.0", + "version": "0.0.1-next.1", "description": "The email backend module for the notifications plugin.", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/notifications-backend/CHANGELOG.md b/plugins/notifications-backend/CHANGELOG.md index 389fa25f61..5d6792659d 100644 --- a/plugins/notifications-backend/CHANGELOG.md +++ b/plugins/notifications-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-notifications-backend +## 0.2.1-next.2 + +### Patch Changes + +- d541ff6: Fixed email processor `esm` issue and config reading +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + ## 0.2.1-next.1 ### Patch Changes diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index 9f7f427895..3aada48a9c 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend", - "version": "0.2.1-next.1", + "version": "0.2.1-next.2", "backstage": { "role": "backend-plugin" }, diff --git a/plugins/notifications/CHANGELOG.md b/plugins/notifications/CHANGELOG.md index 78c8c96f1d..13cff2c7f7 100644 --- a/plugins/notifications/CHANGELOG.md +++ b/plugins/notifications/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-notifications +## 0.2.1-next.2 + +### Patch Changes + +- 42eaf63: Increase default and allow modifying notification snackbar auto hide duration +- Updated dependencies + - @backstage/core-components@0.14.7-next.2 + ## 0.2.1-next.1 ### Patch Changes diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index bdc96a921b..09127ecf04 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications", - "version": "0.2.1-next.1", + "version": "0.2.1-next.2", "backstage": { "role": "frontend-plugin" }, diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index 2ad74d1db0..8767b0e303 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-org-react +## 0.1.24-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + ## 0.1.24-next.1 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 0567691a3b..53f8f83fe2 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.24-next.1", + "version": "0.1.24-next.2", "backstage": { "role": "web-library" }, diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index 3d2bedca68..a18e9a4e61 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-org +## 0.6.25-next.2 + +### Patch Changes + +- 99e6105: Fix ownership card sometimes locking up for complex org structures +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + ## 0.6.25-next.1 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index b00e6f2bb2..719eef72ce 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org", - "version": "0.6.25-next.1", + "version": "0.6.25-next.2", "description": "A Backstage plugin that helps you create entity pages for your organization", "backstage": { "role": "frontend-plugin" diff --git a/plugins/scaffolder-backend-module-azure/CHANGELOG.md b/plugins/scaffolder-backend-module-azure/CHANGELOG.md index 37987ca19f..cdbe8cd77e 100644 --- a/plugins/scaffolder-backend-module-azure/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-azure/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-scaffolder-backend-module-azure +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.1.10-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index efd61bae83..d9d648ec6d 100644 --- a/plugins/scaffolder-backend-module-azure/package.json +++ b/plugins/scaffolder-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-azure", - "version": "0.1.10-next.1", + "version": "0.1.10-next.2", "description": "The azure module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md index 099d4d6fd0..93fc9f821f 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-cloud +## 0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.1.8-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json index 51df2f87ed..d58a871f99 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud", - "version": "0.1.8-next.1", + "version": "0.1.8-next.2", "description": "The Bitbucket Cloud module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md index 83a345f463..9b083cfaf4 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-server +## 0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.1.8-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-server/package.json b/plugins/scaffolder-backend-module-bitbucket-server/package.json index 2c195c8d88..b75099e81d 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-server", - "version": "0.1.8-next.1", + "version": "0.1.8-next.2", "description": "The Bitbucket Server module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md index 31b5cfad46..5067f00aa8 100644 --- a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket +## 0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.8-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.8-next.2 + ## 0.2.8-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket/package.json b/plugins/scaffolder-backend-module-bitbucket/package.json index ad07c7208d..ce82b551b4 100644 --- a/plugins/scaffolder-backend-module-bitbucket/package.json +++ b/plugins/scaffolder-backend-module-bitbucket/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket", - "version": "0.2.8-next.1", + "version": "0.2.8-next.2", "description": "The bitbucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index 1bbc8a234d..23a7973822 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.2.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.2.19-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index ddf56c91d1..f33e71b536 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", - "version": "0.2.19-next.1", + "version": "0.2.19-next.2", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 01535ca917..7220f00aa1 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.42-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.2.42-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index b4206baff2..78b9a2a8ce 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", - "version": "0.2.42-next.1", + "version": "0.2.42-next.2", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md index 959d01271b..fd11a0f755 100644 --- a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-scaffolder-backend-module-gerrit +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.1.10-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gerrit/package.json b/plugins/scaffolder-backend-module-gerrit/package.json index d7f9bfce66..7215239608 100644 --- a/plugins/scaffolder-backend-module-gerrit/package.json +++ b/plugins/scaffolder-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gerrit", - "version": "0.1.10-next.1", + "version": "0.1.10-next.2", "description": "The gerrit module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md index 306fbd6812..c88d71f652 100644 --- a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-scaffolder-backend-module-gitea +## 0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.1.8-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitea/package.json b/plugins/scaffolder-backend-module-gitea/package.json index 77bc3cd26e..c49954b6b9 100644 --- a/plugins/scaffolder-backend-module-gitea/package.json +++ b/plugins/scaffolder-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitea", - "version": "0.1.8-next.1", + "version": "0.1.8-next.2", "description": "The gitea module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/scaffolder-backend-module-github/CHANGELOG.md b/plugins/scaffolder-backend-module-github/CHANGELOG.md index bcef59a58c..39454530eb 100644 --- a/plugins/scaffolder-backend-module-github/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-github/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-github +## 0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.2.8-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json index 8491b5877a..a593541e08 100644 --- a/plugins/scaffolder-backend-module-github/package.json +++ b/plugins/scaffolder-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-github", - "version": "0.2.8-next.1", + "version": "0.2.8-next.2", "description": "The github module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index 58f4cfdfb0..18efb70009 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.4.0-next.2 + +### Minor Changes + +- 18f736f: Add examples for `gitlab:projectVariable:create` scaffolder action & improve related tests + +### Patch Changes + +- 8fa8a00: Add merge method and squash option for project creation +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.3.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index 941dcb5aef..d03fb65c1b 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.3.4-next.1", + "version": "0.4.0-next.2", "backstage": { "role": "backend-plugin-module" }, diff --git a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md new file mode 100644 index 0000000000..9a1c1b8891 --- /dev/null +++ b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md @@ -0,0 +1,10 @@ +# @backstage/plugin-scaffolder-backend-module-notifications + +## 0.0.1-next.0 + +### Patch Changes + +- 503d769: Add a new scaffolder action to allow sending notifications from templates +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 diff --git a/plugins/scaffolder-backend-module-notifications/package.json b/plugins/scaffolder-backend-module-notifications/package.json index 11974049a1..7cb996f72b 100644 --- a/plugins/scaffolder-backend-module-notifications/package.json +++ b/plugins/scaffolder-backend-module-notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-notifications", - "version": "0.0.0", + "version": "0.0.1-next.0", "description": "The notifications backend module for the scaffolder plugin.", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index 4553938eab..f721032c0a 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.4.35-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index a523ed9a8d..f8e1289359 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", - "version": "0.4.35-next.1", + "version": "0.4.35-next.2", "description": "A module for the scaffolder backend that lets you template projects using Rails", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 0ed790e3be..265517070d 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-scaffolder-backend +## 1.22.6-next.2 + +### Patch Changes + +- e4b50ab: Scaffolder workspace serialization +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.4.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-scaffolder-node@0.4.4-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.2 + - @backstage/plugin-scaffolder-backend-module-azure@0.1.10-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.2.8-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.8-next.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.8-next.2 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.1.10-next.2 + - @backstage/plugin-scaffolder-backend-module-gitea@0.1.8-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.2.8-next.2 + ## 1.22.5-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 3492901386..cf3d3d1ca0 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend", - "version": "1.22.5-next.1", + "version": "1.22.6-next.2", "description": "The Backstage backend plugin that helps you create new things", "backstage": { "role": "backend-plugin" diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index f1739c59e4..d9e2804297 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-node +## 0.4.4-next.2 + +### Patch Changes + +- e4b50ab: Scaffolder workspace serialization +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + ## 0.4.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index f0776e6491..11d3da67bc 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node", - "version": "0.4.4-next.1", + "version": "0.4.4-next.2", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "node-library" diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 9c3a25638d..ca23ab25be 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-scaffolder-react +## 1.8.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + ## 1.8.5-next.1 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index b7b7b20014..728c6e23d7 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-react", - "version": "1.8.5-next.1", + "version": "1.8.5-next.2", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", "backstage": { "role": "web-library" diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 9a7ecd2e50..6edfc1484d 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-scaffolder +## 1.19.4-next.2 + +### Patch Changes + +- 762141c: Fixed a bug where the `MultiEntityPicker` was not able to be set as required +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/plugin-scaffolder-react@1.8.5-next.2 + - @backstage/integration-react@1.1.27-next.0 + ## 1.19.4-next.1 ### Patch Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 14c1d5b2de..fe0deb9036 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder", - "version": "1.19.4-next.1", + "version": "1.19.4-next.2", "description": "The Backstage plugin that helps you create new things", "backstage": { "role": "frontend-plugin" diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index fb9977e0ea..6ed9030a22 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-catalog +## 0.1.24-next.2 + +### Patch Changes + +- b192752: Updated `README.md` to point to `packages/backend` instead of `packages/backend-next`. +- 5dc5f4f: Allow the `tokenManager` parameter to be optional when instantiating collator +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + ## 0.1.24-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index ad03071eaf..aef1a1028d 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-catalog", - "version": "0.1.24-next.1", + "version": "0.1.24-next.2", "description": "A module for the search backend that exports catalog modules", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index e79c98ab5a..850db158c8 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.1.23-next.2 + +### Patch Changes + +- 5dc5f4f: Allow the `tokenManager` parameter to be optional when instantiating collator +- Updated dependencies + - @backstage/plugin-catalog-node@1.12.0-next.2 + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-techdocs-node@1.12.4-next.2 + ## 0.1.23-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index 09aa136f0e..5cf53c40be 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-techdocs", - "version": "0.1.23-next.1", + "version": "0.1.23-next.2", "description": "A module for the search backend that exports techdocs modules", "backstage": { "role": "backend-plugin-module" diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 5dabd9f1a5..c4bc71318c 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-search-backend +## 1.5.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/repo-tools@0.9.0-next.2 + ## 1.5.8-next.1 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index c06b99ec92..dde1dc9de9 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend", - "version": "1.5.8-next.1", + "version": "1.5.8-next.2", "description": "The Backstage backend plugin that provides your backstage app with search", "backstage": { "role": "backend-plugin" diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index cde6f55c14..2b221c75e9 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-search +## 1.4.11-next.2 + +### Patch Changes + +- 0501243: Added `aria-label` attribute to DialogTitle element and set `aria-modal` attribute to `true` for improved accessibility in the search modal. +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/plugin-search-react@1.7.11-next.1 + ## 1.4.11-next.1 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 06f5ff47e7..f064be1433 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search", - "version": "1.4.11-next.1", + "version": "1.4.11-next.2", "description": "The Backstage plugin that provides your backstage app with search", "backstage": { "role": "frontend-plugin" diff --git a/plugins/signals-backend/CHANGELOG.md b/plugins/signals-backend/CHANGELOG.md index fcd34ead2e..5287438fb6 100644 --- a/plugins/signals-backend/CHANGELOG.md +++ b/plugins/signals-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-signals-backend +## 0.1.4-next.2 + +### Patch Changes + +- 845d56a: Improved signal lifecycle management and added server side pinging of connections +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/signals-backend/package.json b/plugins/signals-backend/package.json index 24561caf46..b6f16c272a 100644 --- a/plugins/signals-backend/package.json +++ b/plugins/signals-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-backend", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "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 5151796171..00c7297773 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.10.5-next.2 + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/plugin-catalog@1.20.0-next.2 + - @backstage/plugin-search-react@1.7.11-next.1 + - @backstage/integration-react@1.1.27-next.0 + ## 1.0.32-next.1 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 6a6edcd5fa..e1ee4400bb 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.32-next.1", + "version": "1.0.32-next.2", "backstage": { "role": "web-library" }, diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 53ee8b3681..d6847da1ae 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-techdocs-backend +## 1.10.5-next.2 + +### Patch Changes + +- 5863cf7: The `techdocs.builder` config is now optional and it will default to `local`. +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.2 + - @backstage/plugin-techdocs-node@1.12.4-next.2 + ## 1.10.5-next.1 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 013029bb0b..79a701413a 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-backend", - "version": "1.10.5-next.1", + "version": "1.10.5-next.2", "description": "The Backstage backend plugin that renders technical documentation for your components", "backstage": { "role": "backend-plugin" diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index b914a8e3b1..77e83144d5 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.7-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/integration-react@1.1.27-next.0 + ## 1.1.10-next.1 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 5c8a0248ee..8c89c9bf37 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", - "version": "1.1.10-next.1", + "version": "1.1.10-next.2", "description": "Plugin module for contributed TechDocs Addons", "backstage": { "role": "frontend-plugin-module" diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 23f5d333d3..aea92cb71c 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-techdocs-node +## 1.12.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/integration@1.11.0-next.0 + ## 1.12.4-next.1 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 1ff7b305f6..0eda77c887 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-node", - "version": "1.12.4-next.1", + "version": "1.12.4-next.2", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", "backstage": { "role": "node-library" diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index ee3071b030..5011b3471c 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-techdocs +## 1.10.5-next.2 + +### Patch Changes + +- 5863cf7: The `techdocs.builder` config is now optional and it will default to `local`. +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/integration@1.11.0-next.0 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + - @backstage/plugin-search-react@1.7.11-next.1 + - @backstage/integration-react@1.1.27-next.0 + ## 1.10.5-next.1 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 7e06c8f128..d75774cb10 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs", - "version": "1.10.5-next.1", + "version": "1.10.5-next.2", "description": "The Backstage plugin that renders technical documentation for your components", "backstage": { "role": "frontend-plugin" diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index 2611a7d18a..01d7c1214c 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-user-settings +## 0.8.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/core-compat-api@0.2.5-next.1 + - @backstage/frontend-plugin-api@0.6.5-next.1 + ## 0.8.6-next.1 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 3461d220d6..1af0b2fb41 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings", - "version": "0.8.6-next.1", + "version": "0.8.6-next.2", "description": "A Backstage plugin that provides a settings page", "backstage": { "role": "frontend-plugin" diff --git a/yarn.lock b/yarn.lock index 126129567f..6cee25b42b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4337,7 +4337,25 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@^1.1.26, @backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": +"@backstage/integration-react@npm:^1.1.26": + version: 1.1.26 + resolution: "@backstage/integration-react@npm:1.1.26" + dependencies: + "@backstage/config": ^1.2.0 + "@backstage/core-plugin-api": ^1.9.2 + "@backstage/integration": ^1.10.0 + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@types/react": ^16.13.1 || ^17.0.0 + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 + checksum: 590e8293a0e21a034126c1a00c1c69c66bba81dcbf39675336c092b250ee139effe874e443a99521751b3c1aa9b103603bc8a3177a9f115ff0f1a0249ac5eed6 + languageName: node + linkType: hard + +"@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: @@ -4361,6 +4379,23 @@ __metadata: languageName: unknown linkType: soft +"@backstage/integration@npm:^1.10.0": + version: 1.10.0 + resolution: "@backstage/integration@npm:1.10.0" + dependencies: + "@azure/identity": ^4.0.0 + "@backstage/config": ^1.2.0 + "@backstage/errors": ^1.2.4 + "@octokit/auth-app": ^4.0.0 + "@octokit/rest": ^19.0.3 + cross-fetch: ^4.0.0 + git-url-parse: ^14.0.0 + lodash: ^4.17.21 + luxon: ^3.0.0 + checksum: 86324df95b30ff6ae92fcc605bd21d0f12cdc0553d555ebe8977a1be6554819ad8723eabcd99d1574c7c244b4822a6628d01273557040c89360394ba3198f6b9 + languageName: node + linkType: hard + "@backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": version: 0.0.0-use.local resolution: "@backstage/integration@workspace:packages/integration"

    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

7LHg# zqHnj3g1Sq$MpwfAnciMH4^qww^3q0He1~r5n>?R87(YLGtN4?x0X7R!IM^MwGOn&1 zaKVH`MCRm_26_S{bY)~7>y)I=$5YH}k-N|i7Or<)S?KbxsZY8^Zpu33gx(8l9L+j( zlTOp}(lvfT#DZ~~3Qj!M;D}QuJTOxxM|3UNg`hwMQiPK0?N3A^#+BTZ*9#~zb91E{ zICyFTy+3JohmVF^rn1Oo5HFb+JV^_O@F$9bO7P;S0TTlQwigBN`!_HsPAM=DiJdyO zC0pY^ec}LnqB?Z;%PMzs&vF7!|LpON#w z|2Tk4s}wPGM>E_88h^n{v>Vxolc0EeDTk4T<;ktk>b+Z1-{k&x54wG*>^$5`d3s5I zvJd~-oco-xsJP62rw|TtP#T5I!!N#psRrp3pVxV5hXp9_W_2QC6F_6-5Uav#IC~LP z|8~d-da9`@k4AS0{ncSDyhYEhRYiv_lXYPogVH6o@Y=o$x*(VLOZOqa+@m6C=L4 zFZu4_e>?y6O$dXGeZBbHqX<9V_fW1Q)q@Sl=Bcr%DIyt9jX{Q!NT24`p2@t)rc)`C zCv<&0iV4sUMLX9AgC-r@mTQ-~!(Ju?yy<;@zk2psgh%TL<`RNqt_$9pi0H%_re*wV zM_(P`=ArAp$mf_q^SgEUKNf@WbzItGyy}11vb2AeaKMu|OkNvzyInEpH0weATKB)6 zbuYvtj>7meDK+h7pZt9h)oIpM=oPd9L6)qChey%(*?Q-qR#U$Udl*|^oFrHWO)$>; zTRCataWDle9Fm(S`|tvd6NNy}4kQK`rgyUTz8*-N?8UQtPp}bP_63pWhH+R%*u$rG7%LZ8S48D+m6# zkBO9+m;qEWLA4VCZIF37malvWGJHLSbYUB|^tia}vxAsRl7;hNp*gF(vNGk8F$q#+ z+#$?r%J2XQE%5a^?JCFgZKWxZ83|UQG zy$4(v+whdT4p@CAxcK<^0Hyo?$$tE+@z!wyAQBNq=)Rv*ZSZKFcsSs?w3U@90j2OD z*t+hebYS|;aUL!{K8@>~bK=#eW=nbEV|n?pOG-*geyK8{j(!C1QlE_fx2;=$sKglm2|M2UtT`e*H0~m!$K?l_RYk7uj%aA=edYN zD!&;UoMw()%XRflc5d$GDG-w~0+mJV(2$bYGomPB0ibd-O#4lxzd7$7EVg)Tt{s|WcK zH5fon6`ThNMaI_oW-fC1P9lAWKzHgs8(U4{TYl$4qYpp_UzK+k(UBTnVwAkEmmLT;!ygC}}1EnM@wF8TA4{SpS z0>XwpF7kcEOaP3ocVf;7Z_`tEYxEku@Z_>+kj0B>AxT8QaKJY*Kt0%qd;ObSa%d;T$~*J4 zVYmQ*|Ih@<(C7fG5U>>5sQx{(`cLoJPz*iaovkC9jqmPtCZ;QDcu)Ifd!b!5 zfFm-ERf@f9V`HMbTN<=LS20ksu_>aWqB>b1xt`!y!7h{ zHL=`*Kfdq+fea|vmlkC+tLneBG@?*QJ~F>6=;}ldij8Wno2-{|KL@z~<0S3hVXwcT zB>6HqfZVxwui4)O@_=?mSo|LGJigAVPM%&ZNI=lgPP*%Zw$y^$cs-8ux8S}|{`al* zPrqHShIlkmz-o4BLyf!Uy7}}x()G00*W7QeAJ5P6)?NM=&JpCWL(V9AgaMF69!Zpe zOZ~HvQuF_D6+g>z|8c;OH;Nv207Q?ff+6$Lfb%p3B9rj|ue==f*a$cGu3g($F;|if@H7^;wW@ z*D(r7zoATl=~tGnuHCj3gW$KXS{sRcWHJBdT8B(gh9tzJnkw%Rqa0hqAz|Lb_Oke! zzxi{~^kYT$il0s0wBrA6fhJzP5nRkvw8-91CUBIEf(83I5_Y(G&j%d zbFBXERP?CefP+X}|02lpOJ1~=P818Jc#1vb|KR&&GEyO4Gulz(zt^wok^Kt`3t30- zTmt{`A%fJ=v6`FOVhL3Lv>W~c65xmR3CKESrmmr|OWHsF>gNTqzn04nQcnlcm-U4&R_u-er~22dAR#0M|%YlTl=-Fp^71(^XKQLKctQfc8O*k z?l#gdnb_}9?U(`%pXN9tyeIQtquhUi$D*2)qGJDlzN%Tsg83fmAE#GKTMGJ#>rSVi zJHJc6TBZjgot5fF^;IxYVWoP;c2v6sG}5lL`on8dZ z{9xgoE`U0VrmCunr8g)zczOmI8QJ2EZy6pGLUV8^dwF@Wo))+Z|NU3nKW;S@3z*S( zEBi+*5%Pno36~3tibtrSyi^WFCK7tA#6R!8pa1M1F76i)6dv%79_rZri^UefW0!|X zwd-D(O|B0;+U*32vFxlY@${NZ6Z(l~n_a^TGFsvGGaQ8CWC)Bv}B)c5eaymR+7z zJ`?$p)K!s!qSY`f%fu<%e%!o>#pdH=m?hdsj zyoz(|%O40tD=G8aA~XNwb5L>5Nud|(-xmb)2^mb~t%*8)fls?VUG;cB^Pg}SvScAj z+F~>|#{0@_t=>Lsd%u_p*|Pdy%tNs}#)Alx>|^ zneh3R;SDna!bji1dd7yJb4cB#ZSvyPxTZluAQG0#cyYNQDGhk~Aj8@0CD&YUuX*~L zVq6VZ(6Wq+GpxC}we=KWGtzrG=Ht|tQgS9LS*&^n2CM*>oqjMul6&+>s)r>!QLB1? zlc_`x-$7JKDdXD5cdyCStZ%hH;kph#Eb&{C-YbX0l)v^jDK*$;-REW8&>iFS7%rH7 z2`rLRA6l2fUzwO&ylBfg%^gnbY{^G68glOs;5}V?aZqs^d+R>FesT|=^1W)iGnafh zQCyuNLZh2p0QxJeakvnh?(k_3erSK{rxC~**_t7O~}|us3umf?=N+%fF}vz zeCP^|h`_IoWz!NB1vh(w0$f-$# zxiK05wU<*oaEj{%((4z1<)SX?oLI-JURqkJSG==HI}0ijW)AiC9J9 z`$Vj@T8#N}dU*!hU<%6yC&ShN92^{Ui^d!uI|-!;_p1t)V?P~Sayy})#>ww~L+EpRl)ZlQU^&0sDHpT=#+ zWJ$X$GgGW)^1@D~Bz3|@LQ{`JI~-?#DTfv)^X%kx354`%M-LGchh3Z4{{GN#YEA-SE zI7v8AajWT&H8C-PmWW<-le&I}rWc^56$hnUI05*w$EJxO6Piv#DuaWdfI%x&dGAP? zH*%A=L+ryWX=Pf`-h`0*XxTRZcovdKt*orfY4Qmf>g88}OfVkGXq^(tNWBM?A-)9i z0hqj^dzVDNMKYc1d4fEcO{Fd-Zf{?DburmO7%^%M8Y`iqXnkKWI_mJ%3ntk=T$_L2 zYf-sriaR0>h2CEYR?K43T@^+Ur}Y+Q9@Kt!hO@I7#PQOp@V;YqO4Si_QAmT>D}$l()d&-=9;Z&PHBAA;AvxE|&utDfdYU zaOVSQLPc9fTv&7`#vp|a7$++&EM#nQzA3X9raIw#n!suvNL-7Msl))kvhs4^ZX@qa)0>qif%Yor>Wa_g_8yj*d9QC+Ho`##{Q)~)cS z9g(tciPo8IZ7&ac8o?j1oG7IA>jB=e;{!n+ueyUi1%ZMk?98lk@n#hR;%e|P?~{`g z7qNB(hXZoSypvFjqojR-KLI-^DFQ@NnRsst8U{pp=!`>RAU&A*lN2N6GC48)u|Jr)mmV6I8E(6u$R-%WG@N4ewv#iChdvK`2SVn1Z4XSuen# zW16}Bd1^xMU<9eWPF4_mdIq-3I<`O3?IV49+1q-K9fp1oD=gL=Abay6>uwL@2bI`s zF57NlPCof7FHhMwg|Tl8S(Lr65YkW)Ptf9H3iyz6AzG1@(gia zDkWUDl$;GYsF**IxP$? zYxW#C#>eQYgj3nF2!5R;yZcS6n&qLSpPk*in0d{MB5wF=@9fenh0_$qH?egSR2nH1 ztb(Fl*}>0qjbAC6IR~2Puywy+T&cCH8IC^`A3xDtBl(J-)?Qa(KIUBbp{nkM>wu$h zm*j}($+b)*M$FAC2k-9)J&gGYqweZ2a$B7jyuCeo^6^RR;s)7@VuwV@@1$TeN-Py* z)yO;(du=VE%&cBj+~o7_5|3n3(c|*`Yiw_v(&u>OuLk*eE*@v6%I&K+F-b9n;&qZT zE(+Bbp8OIo23M**s@LCI$UY{az*)i>q5lx2rm6lIFrUk-E3&6k*0egO5eN$Sg_57b zP{N?o1Arz?MOTxlvp0EWm|8kp$!6xc7~_PuoYkvh16|dvMWKP&+^G6ciD1lFP*3U4 zOgxSO{$xja_bo1eg9ob|c}#I}%LUxScP%X~^Jr*jnyfn^cY97*YUARyJs+Z=V7w87 zN0QCfA&9zoyNx*L)rkjpm~{87r6nSkVod+V?bEOwB6>GEafYS}?RU7u*fiJQE;mg0 z)?Q@iPCI*Id(zXMOfJDJy(#(dK@DYMum?0(v-X~i4GtQniVPFSbeyJaN>?4?FNU?n zij`m3Qh$Q!@_(LGBu@6M(7Y>VBkPLc!GFzsA=6V@B5cC6o zN-6egDUTW5?UcK2ZB<}++#IjQjqjSk0*;`Czzi5K_d(N=;@0GjK@6CkAo83tvh~MO z!4kj(Z&2{)WW2l@0TxGXq<6|)dP&kKsnx`O1uA+cKW^82Z=_w903622zGFbaUtwsS z{72ea4+k4$zTU(A+^v#1ErudfE@-j0nOBQ}&C5Y*ljMVD{5%iOqxSKqKXN->mhZTQ z2{zjM8F5Zq?;Gu}xhhy>2J+1{iuf1>%?ekv@bxs`E-twCx^Incae6+GGg~_6Z4znp zeVao;DSpC1IYQ?q>aIyhghPSVuNXTXX&KJj zDlT&-UJg-n&l>vJe>d`UKN=vPAXBBnIitdg3-MdLaWCNHr=8WCYrfsMfpg#Jlebi& zLNG^D$wCWkdu;gh{()G$;EQV`76Xn%eRfujo5Nk%p8GCB!_VW=*)0p_9^4tJw!4($ zR7ibT&el62?QY!geL&z?GSi{m!Q|-0=~N!cvMTL-=fdScLPik$W7{TmDr)M~itTP~ zs}~1V03NFl#qLRog-X&XzAKa*)(lSvbN*d#xX{Kbx*XhZ>eeC{$?PN~#Gn2UI+L^3 zOG(Q3kg%rlvHU}FF5RP&mIJAih!wY)nNXyXeIJP-ypdR2iis{^s^fuq1cAx*9Qzyad)20^3ZWn*Q ztKF5e_3!5C?$c(vZ+V+H5|U{j(o{YY0BqFZ#a7YErvp5e!^U?*Jmn=Ohg^Mhn!=Y6 zkB!6X;EFFta{4M;J5wUP1vOhr1kY_W^`@<;)oLX}U5!Xuu13l|}e_vTB>7$x~SlEg=gZn=0Yc!k)!V= zpT#`pUkfhD5YR*(4iK)jkB8Z8 zohlT9n|4JEQ?lkNq!tR%691U}gYgC#i6I<{vcFCQ%pSu2(`a1{rk7Tq3n{v5bL$V0c%MerwQlAcD@mldDu6J zX}Jf{_;mOU>SjAX$q)pFD0~+BXGBGgUx*2FX1=J9F`nLseNzLVv(wwt0Y5Ld7rY7j#Rv!zcpa6srURcX zWHs7fFBJ1_Yp{ZK~-P-2UMAabIb>~A)6YtEDpWJri!Gi%A1D`Yq62fyz*!E)MfO~i+8sCun zg4Iocgp827bq0=ZSo5RD#K;zWSH05|C)b404(csviL#=4U>NSi-gO@2cEU`^CicX5 zCuOk4cR~2zz~btkDeOjV3eO$*GC-x@-Trtl{ zovyP;mhaHkmz7JdxWiK+UKzCRm6)7d7b{&NpYURn$&GpY?o@@3d8cRW@f2~t1+@R4 zaB~M*Wb@1~!~8AbY<)z{4ic%$Itm$k^HBOahwoB#VBF;_!I9297}!5oZRR2nj&wD^ zjm)X@ASlm|0ya3&aq-b#rJ(g22x>gc()erhl|G4=39MI?QnhEj_(B_krWTc6jgt7FP~(-AyZ4xB0S!c3S&!ZcJ<5zS|5_c9* zP5fy}OCKxo$J?XE@FVzARF1 z-u-tS6Z)>vhz9!n!5GM*ZdQ7zE%7IeGr$acxmc*42<{sGX>VDXPSU4Cu{7vJ097f-1t zA!QIhkd$J(lQgGi*PmMfv`))5f_gNU4|<(AfGg#T8TYEf zZ_6mud8^FMMj#C+!XUZV z5VMr%0()Dd?VQfslc30C?*8h#v$J*|PHz^k&zL)r8IWqWW@@HpQ?bI$!lN}5N&NeT+iTzPiJl6iuMyS|FK-1QX=$JzJV|1zprhfkg1?Iz+!K!{(T z;`T*l5DRqnOsw#Km$tDQy3*3ox+QwSAoQ^J8GJmGt(MH!xCfJHbyzud(i@ML^O`|CKw%hN?l-rlJfLMOQ$XZIGa zF&M`pj8Vd5yNWwbZJgOe#{v%rCi20Efj#aH60~+psO0#MSF0`%(d`q;R!cyGz+8l= zD>gOEeT{Zv4eM9*mf3uEb9LNKtTV%=wVB(D2_XhEN5Zo| zIg+f-X~2QVIXC| zeC&YC_)UBC?L!3xg)-|c6?#mSOj`7rGRKgzt%y;6kH)f ztrA=&r1cLz32s|H`*7ERhxG&D;ioU)k|FeRv6L2f}w#J)xbg{J{VPJPj&Mz|G<(Kg@iQ6k||!|S@Kux}F2H0846 zOC>efD9Bc+F%H60`ZsfO3CXb+vvj|rZOGR_VVxa6HZaIW7Q)PkK)}6PUUwW`D$}kZRpj= zTz`W|N(cA4^?Lxl_|BIv58&7^_m|7m>O2?nXZO?j-Q_%KEnLm{l{g;N?R9IlceLjy zYLQn3EL2CLe!w_7a=r5LuZoId5n-D=;p*?VA$&$+b7$uB`s$W{smuOD$|o(%Uj|K@ z)J!69?OMO7i@Y(Hhas`i-?Wi*3)+Q~BrXj~YMNweCVsc7=GA zoO)mzz=|iqU!L|oB}f8KPc=Tp#_i&xx|Bi{w`o1)a#v+P|s&GH5&-EXv=OC=zuf|FnuiVG^k-z)fg9i zgIhpXEYQdP152zO<^<(%j|JHV=7AvHa@?4fLeg2dg^MF;$?3ttCn^be9ReEs1YO0E z2CEi>m&R^ON6hYvoA_-fbuQu}*99tM3<_%+y~ZnT#+L^sJuFpe%dX?Lx+CwOOy-X{ z?WD{w6j(Q}4jWsoG;b!y1MV(ml9keH+nDjgrfW_mDv!Y(My6h8O^&cI6uY&a>#$fl zOU*N5TRM!_Wf$k%in%0~%F5h0&d$#96i>yZZ8TIr!@W-}DoJBw6TI~*ie1s=_N4{0 zI>zuu!+JX}N6czA_z`+9brMh&U6(&o^7(APJ!BsmVG4F&wX+^od+YCBIM@ZLYT(8= z@K>f2Z0ClJ`d=iWxw$nE^JWC^TTfRGkIaem@{zQ2i$*V&Nb+rLNRT$FMcm_3Aqq*1 zyhb_`&^+06klxd@bLrB5+u3`#+DU|sTFdD=S$z<&W3Xd}d+>H)*VnU?rAq&{fWM^D{*ic#hJ>W%p9z2SJ~POLn_?@k4 zYROJc`q{k84)e-}FKEdR1yMdOZfzC4BncJT7y!=+F&Z2g7^vQJ{0I5uiTD3e_LX6A zC0n}$2=4CgE&+lDw_w5D3GS`|f#I~By8764u}#6&%fW6u*u7(jr1 z-%-g0Z@x(I-3BHam8=!|)d>ushALUkG_Q27@4``K*K|}VPm4_{n-ZzHNvyk9y$fiB z>(-=FB*&V2Izwc3gixyFS1K6A+NCd->Ad5Wz|N+~IK>9!%FS3+v|V>|Wb6wFaWQF~ z7hLny1&+&v0QQ{?e<(3cobI>Qj;kNQX$5WFQsWOhs)Pgf;*N_jqi@(6=jZWJA1%J@ z`>Z1_f6@ujD(2@Hz@2Yw+%o1OJ(Rcp?EBdfQyo=uBFPWUN1!kqSD@2j6aQ7r^iAv0 z%u$0gD$gJ$I)>!8v$wBS2VW`7zQ|#k>1RHW1fxe>+e68e0NA&BVp6RQt`#74O~O#jzu$Y0&>V+=mLLB$ zV6{i*gn1uX+Z_ z9SWw%2L7#aEA=;!y<;A=xu2yo`#MY>_45im^Znn;zJBtuk!%n-Chz~*5uJubvp(Kw zBQ)u{{$TEUsAyhyT69h_3Q>du=ns(m+#V%G+{kgDKFADpg`O+!gn5K*R~X`ViL69FFZldK%<fJY~CD* zkiSkVCP3sz++E8?eS4DdHO?E)lX>rSrB*kT_HH>}h>b`SY~h;n`j`<60xmWxTNJt* z3xK8B4X%-&O(@W+U)HZ&2{W)@(l-hKfK&Rlf=^|UzP_Cp z`4&J+%Rp0Uyt%cxCt>F<$T8n>&8F_3VRFcgWpNj-oX=HCC+Mn)mD37aUNT>+>b0yj zDRKwsYa3mq(AEULrX$K%63kG&O!Zw6*>={ihp=8OYs}WZ(}NN%PJ#_!`qsbTD$g`f z?Z|CEMK^?h460n_rG#+sPItB&AQaP$CyM_W)$)Vl6R#{q7>KEV)cRMY(}&@`?qs17 z;PW!T@Usn&OYR4bGo|nQ@Z>@8g}(;?EN1@e8sIqnY*6P(zNOskHu~X3t{ym@t`{;8 zOp)$7IV)j>r~Lw_k*`byRDwtsfWvQPwXdcCtyP(p;Hdn^XY+Bw#~m@0pBrNrKm|1l zIJ8#%YDDq}0w9wAnuLjHnElpOTbiZ0w*PX&KuYyoQs0>r4$-N_DO1+wd|A&wx8KV7 zu!d3=UgRpRLi!DYY$dczAe$v}>#Az_WyqZG7#BM1;uZ=CUH9eNx$(U4DSDP^P+sUW)Trt?M##2{cC5SFY5U`yzrQgzI-uL};JcNs;5Zo=Bx%PNWD-=hC z;cf{{vA6Lx?_8lAF(LxsOaQPIzCPSOKaD&!gZK!AC2d^Q-X=76SkBij%7=N|Uwv^H zs;aJ@g$-#!!qKC-0Op5c(G5H-v-AY6spaBYk|2`)6QGoqRWejv z*xeh?=TkV%52lazXmP8yVA}U9dintNg<;-4uEP14FV+A4V*(5+2<{@8jd#NKXl55z z39FaOzL(?CylafJ5Mg?4i@LLOTi}H$#!xJqme{tv^TrHRux}4iX*X0WO*dTU#NV^2 zdGN-m@rF9FzN=sP)dBbqQ1J8CmUi;F-7@7BIKeb`Po5vI_v0f0L~W7PuIDBJ8e}%z^2s2pjM$FpwZsm+#etWF zi6J$nr7Mb%BPN4mon{_uZqc$?{GzW7-)wM?(f`(SY(CF+ehGlhUF=zI3np|+OG{7o zZ^fO92eC*GV6p|nI0)nsex6ufKcZW{SYZBm@b<+VYXRL_LEF~0qWOM!-tL?}v}WGX z#X+^o%`th7e|0a(>~`&ZWMdd8w>fsjm2-~lat<~8OfuWF(>8_VL3a);n7j^X&z^xF z@v(B5DhNKyS|j0|((4MOWxjX68pYmvg2y&XhU3V?zQ28aJ9iJ(i2{fBcGNO~KRdk1 z(#9m{M*`g_2U(Ree_*~*W50;e#tu}y`Zv~P{At}Epg^w-&{Th#^ncFs}O_u z#$iUCN)taj9WD?YO`B>ed)E-Rm(91_z#tIDRylu|F8qz| zXpLl&95#+?Y>4}7@Z-ZkC^DPYh2Ma~00fg}sgCzqfbNY3Kz3j5f8h|l&^NuJY5?K< zO}Fw}qj}dF!F>8!`)wKbQvkAL76EJWsT=CJ?4!W<0Kg?<=UlI+|Airey?N#cSQng4 zw>>Gfo_?_wmy?Tp5qJj`5H^PpeZJ{?=TMrz-Ac^YcqJX|lreCa$CZs)% zFjSMZ;+{4?KJEAcV`@?z3=N(8N9k9bNp zZ)-a>hA<_CWBP(0#)grdQ@)o>fWlv(YhyilYIs2+VHjwt`wt{|Vg9bp6|yLEF_9Bb zJBqs4r-+MOdI@Gte?69|anpIILEF_eaq)c+Z5q}ydQ7QJ>7GsVZISfdTd6pFUbiqI z0tETEdTu`AR*}XiIkgYe+>?IX78eN>DD!AC?cbf3I`4($Y$EOL;@>Xi2@+wAbi`=d z;BqW1aEv6Kv_moym{@14BaLd$*EyG!!uSZ^MLIC^1YzwSTGrLLEj8+-j(kRn zj+53VFUQKDhsgYXbBe02*zpXxo`ivvv79%V1#Yb&AyHw)QmT_;G+u8EK-ULYB7%P} zIAo(A03?n>EYbci7@sB@=nIu5{rNUsUGCMY_bDg{E$j;Y>I<`3NF3B*V0K*49DlJ$ zJN8A8YN9hRBxKmLBfPa(wL;Jfkf^Iu#eaneabk6HvmRj{C20Q0enxC_1ALUOFC3pW z`ar`)`$e$M1K{&aTLL()e^tSN*2E+Gl%GHa%N|%i3ybv3h#jY3nhsQ9?qzZJRa$F@9{%vuSW3J(ob|IO_?40O~ z&+rwGoW?ShSk<7TGp4j$>DeUsyA=EbbCF1p5iqf&gayu`HUKq{L9vFf^NGKn*1Mb&GQe^#TyjBaQiy zUHKE1)9;s`$rW7(nc%X%h*{$m&yrX!PT`Rj^;sk9JOPr7$fP`A5DPl~6!ie1>|*A$ zxxzl)GJ4KC%AP^2skHC(!5rf|fYh4oZnBgoEZQdqZ8bX8SL$ua2U|s7a=+$Xq@$<> z__o%ClLuf2*SIVIqt7TB=KXca^Ua7;iK^(#>te4!tvvlsF)^`S&+~|TLKiu}cKf4* zq@7uez#?!a>ydreh>Rf8hx71*ehc#l&vEULTmCPkA?IvdOvz@Aj=J{&=*u>HC z89;ZCO-?E$T~4<;wE^eRx&HZ}sJkk|skF=YOV?yt&?=2t=$P?P&CKlqg-Fl9_hl1APhb@MhX%VP%QB+g9&z9pPOx z-r7F66xATF=>n>bxg$*OsiR1JJVE$Bwo2|N7ji4wJnz|CxaC~Y65c)IkjsU{Ky99a z5jumCDkkv)u&FW`UW8^P^?b#+mKOk&{?y(Zi%*LkF=HbiVfrmMn35xjZ-r_4PB#}w% z;t)BAb$GUR10WrJ<@TIvmAj#`VOA!g?udT#bVP>%AGv~2B@7O}&6RSbz^L@lq zJdvNEH%uJH(i?$5=mzHrzt*a95Y&1?&x|(D& zr9fi_cQ6@l4W;kgP_Rt4@ANu_ADJ;-A1~P|Ra~u^=9`Y2$q{*O93K}zZNUYl_`i*E z(8vdi2)-T>V{CiKLWy|GcbzcLzpUf2%Gt0U-bAL@(3M_Bv3kl3w?0?CimKMUp-fuP zgE8$?<2Ky1yQNWm4I+i4Q&vj6*D1swi{jvIV2s;&y?A&L1{pyTK0j@!oe!#q3#v#`wpD#T=r3cjf9VssGH((SpYt_44#wja2{oUe+EceEJk%keq#&>HNt^GT91$%apAojoqM1p;+voK;gBSFzAgCufIlF2oGR}xjB>er^ zrmS^pWFthMgiSVn5aP<0_6KHIlpnjjtskb%nq;M?l1plA;6>GfsJ!m)^wb_F)e4GD zkz67`VqQH80_W3N16*olz32U{JlRPqb;hvfhV!TT1tutR?Lx1>Uj<-gX61g+UQVHZ zc6pAyOP;!$*s1I2pXt=_*PG!O`%+T4rh5|YZQp$3nu}79GEF;)8Y|a>L>gOw1pmqX z*bhjJYvmU+?GX89DmQ6w<$^ymGvgL1Q{d|R$)giK0qGC2pHg|HrI`pPgb^YT-QNfG&1!hG~%c}5hTDOy%nfWIlXHfsi^|E_e4{L-{ zTk%*q$zA9O-=tbXGoT4%ju&#Md~{b;HL`bAA&H9@9UBkTwGT!io9=o?&8)1~mKz_iB6cby0&m(m*lbf@l8kMF7wab#y(X+@xEWsO5+L(GF04Wth;ibjR?yJM`}7V7MZ2}}GNn$^ zULVUWx!zmOHX2p&MsWWX1FlGewg6!0{k4i|C!8)VG-dO#KXx~QSL;1$)BB0eZhlIl z*3G8@+LnI(cgG&v+zhy)VS~#LTO3@3+L&HO>iDabD6D_%OWxoNTs|H(T*)7$SA1ub zCDgZT(?a5&gQI*#D7(N#_5W{`HKd<#f!M08p&QN6p~@^V{t= zm)cqX9DEpRRFCjsz#NaKZ*pqVOh8E5QMySMQLjmDhu5nUylFaQ`Qc6l!Bv^Eqh*YP zMBcsia zT06Y2DKU8LKqQ!4A|`U`xQEATb|s@_M&%LT$Y16~y3nNi42j{QbfKUvUs+knu-D>M z(fj@U<;dn=F9&+iA(Z*jNye*yKjN1+uZnqQT0NVjRIHH1!ttnqm?XVev!SvF27Ke) z)r>(S0>MVQ+a5K_Uor+hgW({`>x7*12c>PCu;qADx=))sibbowTSZ<(BSvO zo&+dNJ&^n{L100Va6N#mE#3uv8GRKSuu^bnp6curJfuOlMMTV>WB};QOXya0AOkZ0 z*&+OhBuHi5kf+eoYT@|+>tm|*HWy)5SIzrxx#hn=ZmFUGUq(h~FyPk~%k`Nb&|U)c zfErnoKK?061bom&4fQ*9LDX52D0N|eTQR523DD%li1sVX`JBc=b-?wEjE6)Jpep7R zHmbv%os&~?YrL2v7AW_#oq6FK_|P|pW<8%pKA_HEME zeNA%!RQirWn12QID=5hPVPZIcjg|u?=xt95nw?_{Lr_E!UG8rJ-tSrPa=~9mI@&aU znSlQ{xY1wt`{&60dS~Yh0DkP8#RuX4^>FPx=AnFRb(_&4m9S1&4nP@XOR1ef3gB03j&)&uQ}K zTJ&!n_~)Cd05`lN30C2E@b!ED_`h6m@dG`A&~Bjgk01Bny5i5#FbCSFYOhE0*I578 z7X90s{E&bq;pi)u;{R1w=t{Rwb0rr1e&GIovFOil5?S`GH(>AR8a;u2Mx}iNqL3ooj51%G4V2O64Gc=2UJ&bwrCag@u)4;|0>atfeH<@FxY1H%|Ct@ z|1|N+`Z_JNME@8Ei=?37ojAX4q@t3txT|ZyM#@lZ^jc@>_$>Ps899Zbm(4kp)_$2a z;n%~y7S^xT^>VkXYf+7hebWc=LWwz+2Z`6A*U{Qn6|JX}*lJDW2mhw;pd7 zA!0HekdlxjAoB9^`f7~J>E@fl=PGq|G)GfYqiJgm9UOc}!KA-oqSkDfcyoKNQCng2 z6aH*(kn#Jf5G37s;*34CR1%K}fHo$ZRGO>=uz6|Ra^Ycr=I_5?SSyv}`~sau?z@~e z|2c{3J)pk9F*J68VpP3F!KEx#ege?CwEo+KRA#d)!) z(sexmLm#|aQ%j3ngWbz49Z5z?a`y&$w$n&9!`Ye;kW?z&@}4}VeY&gzK4u~60|-3B@$C>9Xf8N5B;UYy#sN_>GRkuhsJH#L?DAQ;hLp2}dX zY?FfB`E%vWA+Vm&Jwdh$4%85p;&lM&`%RbYCNb21wB$08WB;}efgd#X<~lCes*kT#|;m` zpWBAXX~89U$9%oQ;9j|a%J~`J!opz)Jd-dwM&X-|VAe%wXner=7dr+@jp4MRSo_&o z26s-28}U?UiuLLzT(|D;%wwafjF5;&@l}b5G>XAxVR)SC^5YPa61Eiwvn^HrCY{Ug z_#qH*is$=>hvipgB*_FWNgdlkdf2tk&d(g6U{bnbI_UmgITg#N$vfQk6!aAQ2DF^9hl{$jB+* z`|d%ulETAZMrW&j%=bdW*l5}dIC5V8PW6b-<+f42GS}VHHwY3Y;lDyfLldb$DI*@R zrf2kcpO?SP>Up5Hid=gflwQ_`H9eSC;1m)khUq*#qxtpz?@Q#%HJ~00ENkdxF!#d$ zdLmY$`GJieP_WO(^e)wzX)OK$_j~kFY=km0JFc!@`$5rk3Pn_w>%O}!>menlrcn)r zdD^}N`??+qjTlK-Xs3L2ll1tN1R~p_ye-1x{x0+G#9vl+An}3bwquC2d!#P@gRnKG zj8rt`6hZ94npvR3c}Li4h260dSk3ni@ir^{EJK>iuH$Ld>qRQ#C5YFr`@=ZTha}F1 zlgq@7a@=jbh5Vfeq|#WVr@P4>OY!IDXG6q+`aYeuT{0Xt*FxnNOAYqHrsHBI)V**L zSgF`$+iBj$VU^_8$bN-f^GtY@k3UlAWoaVd$8(3Ge;V}8&8Ir_pxsWtdm=g6(N$Gd zC3NSuF7{F)iF@mE6{mtddv*Ba>0X@|7~t0DH3OTU`j$Mm{&2X7oQta$5Rv+DyjV9q z0C-MlY!GLDvMXG0>RaSGww8S;gOed7ImgtT&N_%94cw@S*NL2)o5OGw6^!M2E*Z3n z@9usQjrMfc4(8>1SmB+$*xdfw3BlATs5Os6?tODu_KCP|*|iJ~f6K*^LDNxy@7|%M z_<0A+y{UINrQw{+Gw6_yd91w0k-apY6F-f0$-|(AGx(pQT=KHLmM~y)|HicbwFY2= zdw4#^8iUVEZf5!Nup#f>(mV|BL~zU>;NoO-Ly?lTT1UpJOz%T`N*!pZNiVw2I#zy9 zo22}%;z|WoMd;obgNI7PA^SdRY(Sl}xEW`HrlOB&^N>gYn&eIdeBi7IqW@U=xXQw6 zX~w0&d>AA(@ac$GiLM8|hJ}h)DuBYDHtO^GMwt<*77;Ve0Q+wE{rvE4700_o<;|vNzQc zVOVVH(5N1OB5@nT2~oud>1Htzk$s8F@)H|uR;Ol<(_4r^E15JdX%v*0Z}s`&KsAZP z@zRk+?vj*`?}KPKPPXz>VE;Jnlin;MpoFNBib{Y&bO%7v@(t5@i~88bU3I;uy>YFy z=|24YdG_RPt&z4Yj>n-FEtSltFgY@|g#7^eK+fx#fTNQShs`3DJCs0ge3RB7;C#8=hQsmdKxgw~r7z|^Ns@J_ZfsF`|k|(z7^mUSVqk3+1 zt_=++r8n^Se1f)@QJgBnF)@_kg9R~^c!j`Hq8W-ECJaS?Cn_rG>DhuOzl5Jc&q_Pa z8Qk}eXZ_!20Y0hC2yZRAJRo;`pej`SCtn@-7H=58uifhi^v&`Gz;)=yPF5G_X5f2K zNhwwDw25cJO|AA+V_)A&oZIt8p{rBGeZr$L1K*a&p5Y(J6_x8QnGgGq+49q9`W<=B zjJFXYLPiVT;^cHtF|jj90$5O0#D?9{F_u=h=aPk+&V_9vn?tmV+Yz#n+#hphi?F7D zq>YL=5s^Vb!Hu?1Tazn(Zeoy4!AS|OG2MonH}d}8le&u-(S17orNF3G$G>lNxTV_Ur>(os7T6!cNU zwE%iFi2&0Uy(G`7O!q71&cNfg{ZUyc9D=)EjQiu_KeYfp?Jyyn$eiBhrB|O6LNIrK z;b8m;Y~0Uhutj9tO}AdhC9T=#m~_#*lA}zvYlgEWJQ^vSF?tT;dZFfFHkd_e+QgJH zcvag1E~o9&gi~#@xiaaKf|2E?p(6)I6<|k5WQw#Auw^ZG(Lw}&9#Q~f$5l|6} zW~iiSu~Xlzb>@$i!&Zg_rl&XtSob65d!S63P9I*YH8r@_IIC-#genYUqf=%M(1IQ0 zjL32aAxB=V4qI^A)pDkQj5TJ72+uWJW>}-6AHpIcV; zi#x{AgZKSVvsYJ?1xVEL;}+VCwHC7*M56qwAt5k8@m|G|*Tp)4&D|=L{Ri|3+Uh}1 zrXcjYT8|nDOju~>$xd*4{DToWPgul=(F1MQTUSVC(6f=E;~mHW?ylLY#H39&3}Rxr zVJ0ZbANt_mgxW#MV9TE*=!FD#;GX^p%YJ1+K7&C(q96aWXG`uSyJ{x_(E}BMhJd&F zoog{TgT~|zN9(fr1P4#j18YQ4A#Nitil3;9ML$*W0V>h9q}j%F*?PvyNJ}J=(~xqew))P0OJO(f}qEPuC0m?yjtfiDXQ>ZB^<0O~+UF zo{SbL_f6Y|MupdSUY(=8P>cu`)ctw8Qf^gmMKvOx@n;x$NXz{L0tZiE=j<%+_!W39 z3G%8~stmt|o;+wzkvk0gj*?(sXkGAwod)ok!K!t^ z4hJ*LT!6(-L9W~FL(Y*OG^!yXV82MIgFMbI)*U!BFpvcp>y4%H_O`((ah;x@XAd$o zg+U+^NWEy4ELmp;H6$k|zt^a>$UK~{Q}Fa0WZaLts`ve~?GAK49bKZ(&eu_PkvF9G z1?5C#29O7SOI?qC_xG>{--mw6gx9Y1p^|8R9&YiXgkuc+PHTx!m4RRN!Qx6;ar!+Y z6oE|Rt?8iW;=!inM*(zOErYLLmzx``iZzo}6cp%%DKx6pQlm?YEHQXzW>V)>7}E%b z)_jY9Y<+R+dTq#I>1E%Vmxp<}oD`4?oSB+}W7jwi9sA4oRZvg(=@ELAEuL`DjST;^ z?6hwU%%fD=HU#KZ+7_3Nm$C82>T;cr_Nq`E&WIIJ*7UsC`Kcx-JtDn5H0U_iXjY|G zNf=~ZZ|Xz6W)~J0cMC;A`z0S_E2^YTuUJ<1_DHJKq>zx1W;$bh$8z)Q$;}yxs2Jmv zVp}EOJ6=n2YYKpX^Z)&o!HE2}?wRK3y955oHT$BACskfYe$eV9Y}eYyhwtmRjF_H=Zk;-{F8ChsPlnkBD=Z44>OB zV;y3@JB^W$u#jUeiyHZ&_qtDU1l-LZ-$6lrwwc)atslvo@*2}6xGgSyLRA-sQCD!P z5{o4&4htQ5y+-S+QL`LhMp7No@)u1yF zU$B%J>6`J&Pbr$InLz?Yn2gkAk?6#~|AawF;^By8vz$oY%Pv-&ZmV&@ep@a0A?g(V zndQp~|2$@3h1`z;(PirV2qX;Jt^IA;2h-4oP*+2kWB34N`fdiga;A^)#%$+E&m~}B zuU^LDua{4&6o{{1>%&Eb6B39Ip9DWLA(cM(X5of2I~q4Pw;N!qWzrplY-i#Wm6Vbq zB^E&tM}RzIE(kb8TsWKn9-`6N*+=iq6wW=;>A4in;bKjTP~ZN+@cMX2Ffa5Ed~`t}(v}?(TdlgX&0I6Fp?!;N+hd5W zUIQQB)DoF*a!N(>cpS>hnu!&6T2U(Unq<#kH&M?HYM(WK%&Iv{rq7#o(P3RFDU8#V zJ35VFZWKC7yClmE&L`xTupiy}Caahar1UH|s4Mt&vP}-Hl2mU>Hs;ngEJy@}N<*Xg z-NWTbB$uh{eFsvQosD1vOEY(hE*BHX)z(bu!w=B^{se)5-*LTyLb_P;%VYp_7C-6Oru+g3i7JD&}=W_hswXwfJ!PC55(=%(tPb^v3#a_F_Ytt&nh^|ZH!?Lfbr|8j-f<;b@hF*{n;Scr9Z2s^oc6`=+e>Zxn@znNf zn+lHE?7*tj{>mf8$h0(?ymcBLGGVd4T6eP^5fL+76%J=M%LJS8SajGCIDFHst;|dC z5As>>5PM=0LW`2oj1!Wwlbe$19pb z2`Jd#iO>cn>z2Xw((&?YxyichWCrfsAGdKRzjl3T#J^q`WGmD%g|ex($g@zZ#OX6j zji&gg&(_x;2k8rPm6BsNP#$^lOm~YDtXdWp^iv0)Y;;uYoS2Tt^=$malBZYJNScK- zo1~7rlGjr8G(OE2Be1$1yk%RQ63!HjM8ch4HmsWQ8Zx2~!b`ANZ1qhr89$bFP{4-O z3+XwIp9%?a(APCzjq8qm+oc}#F)Qo7|07+oNtqb*p-b-=o%is_NW91g<_a?tb^}Ll z)-w5rI_Tt>Yz1S4(29TCdSB-2I23>6sA)bk(!VCQH}NY=r~ts=t*5-c=W(vaTw{Y8 zJ46h$RR{3Vh_*ay)a!z<#gTUw3=shfIZY`paeTh6cRl}DSW==C5~lqQfNZ^N#v7EJ zoN7~g$B-c^;7+fHhzVb$@USU5%VW9%5yycueQE%=P!4td_YU1U5*RnumU42sQqPv!ard&*9AYY)(tPDD_O7YJUhI)|bB9pC&+=7LDTEcePJD0(h}}5j zZ#nt6JK4Qq**C5GWMiC)YTZ1?g~-jr;Sm8 z!m{yeF1wxfSG&kxXv5Oq7KpeHW1(@xy6{>+UL8iMynnv2JTI$!Z*5Iz7Ao#1WaUsz ztxbP$aM(ZJSC<_q^!)o*|8X(83r-}yM@A-$ zPXkyNNGD681uN(`&szULI|kS6O@mZtbplHUs=h^lSqE}pgs%Bs&Yg-Lhty~t0O#gh%Y8;iG-gc4O)2X!No%Yt0hWBKJ6b*TjE_(Bl zjXf=AncX__{U-c#&Y%@31_M=Z@*c;s8|CcGPN$8<(zl|bSmz1HQ%4SY8-Pl3dL(#I z&P1X)eSY}9k%gOnf>bxZJVq^pN zYISpy{5>aG_e6ohW*{qIpdmsBJ_|Us=dwlro;hF1RyH=IhKC!!Xg)nZu4ebv%{}Jo zOv!m^%M@L@N%{}WL8v$I`4BX@VR6pPj;7i}j)tZa<~9b1Izm4RF6^$-u1&bhsA{mK z8@Sj!>6-D(Yo-rAAI}@aMyd@+gwBfL%8rAbLq>&W(=R&T644YDW_MPq!<^e=oL6Lh z39K}kvhlPA#lT(Y#Lvmg8*5W8&Dby1kt9eMeR~|fp%NOpJ|H^fWwz@e%$qLV1c$4hICrz%+HS`ox~H@`z2kxfpa!GG&HoRc$iqx z>*mOOHK(|@yrJi)?e>gSz52!t1|BxgbliAs!jyGGeSmi0d*8f@>_wDouH(;(TbY9} zq>qH09+3eExB{zD9~`!MulF1qtdFhkj*=NK&uqZ{So44PJ#R4oIR`AS=~Tk6V4&R< zc?S@;(B_wr2yR5^5%NjWBU#PjM9(de&$X4^-z&TqRM4=ZD=EpVHXeZvnGLxa+cv;E zdNHMU0K87e0ZmY8La!U*!^I|*kwGB~3%VDx^vdDeF#p=$HzgXy@$vh?a;K+~RE)8D zEEwts30e}|4k2IM?)!SPD-#uMy*j!~Gnqt-T8Yk%H%>{C(ZeZ-<;*dyVj<-qXnUTB z2g2fQq(srD@l>1bj+u24XO5)_FXtW&v`-gIN{X?AyIe3)VI-m}(l?(WuN36h`Z3b3Xpww8#GnMia%E@lD8cdWp`JN7csp`4PJ)_ zz+m|Ro%f5wX`RtBT&X}AT6+4-Yn5hccjsf2B|@B_=P3jPXmXLT$T-JvFDvmh%^c;U z*%cpjZpQbr? zjsv#dB0>Q>`cG%^yAKw?;gUfi_Sqk~WX3eo_W?@`@~b2fJz{*p_O71rEYQXL#@w{% z%7IHBE{E^lsiOsffq4r-b+xr9$s;|n>FKl_7aF)p98a_R%DQsp56P?=euV4NPvPu3 zIy#NV0*lLi%U+kS50~4-5c>7~yuJAc28S{=Pfa7<`gL)?SoH`9shLt685@6abW{>! z>@j)9L-;I0z_8W^JMel0@bA(8Dd;|BP;FrNyQJ|ubrJ{NcD_JG`qg|lG@m0fQC*w4 zQJ8GeFJ?-S?T#+2%LztMDtRG*0a^`>_zDstov7}3?PM-`h4)xl#XjI-FUApE4rdX; zdxdp4TNMZhif>>Rr^F{E6#};0=QrKsfSUJ)F@W%9@c{eO!2@V*K>>P_aDR<+5>%`r z)bT3`|CSIjfWL8qro3>(b_(IDr5NIgU&G@9Uva;lZ&+kb1 z_b+jPd$r!gh0luN_WED(=8hofqI6h0mD9mYrW=~BEHog4@evx>4@M1d0eag+D+Zk^ z|58#yV=vAkV47lfb=>w`nyVl$??<}`=`wmge(e z?lV^NDLVThBPhrmUv@vg=)ixb5r2m1zZ-X<2nuMRPEZEA0y&*`yDO3^;2!J==)Q0N z{A`r;5t^e4&)4Tm3p&qfH|oa9if*<2l`xajfoirT)Ws#nSR`T3h$Tcs&e8}PWl zDtr9bq$@i+Gr1D@Tn<4lpHs^g1;R3i{Kp>Y&ca^BN? z9yd0PK-tLjCFpMgT;!8cP*8vk@8l8iVE>lkV=yn1z$6epq>VJAWF;j9x9D*`C?0qs&hP67V*~fL=}4Zmqx#fBgUmC4W#?PpZ)0_~WVJFC&eN z(-_;I@_X&WZ%w|kxhXxp>=L87RMu9UhuXL9zAs(%4ORp8YK?n^Mc)En84#e< zd#R~mm*})V{@$$L*FH;PK&^7=TB?HNfAO<+ z?0}wfxFv1>e=lu+H8VNUIM!+c)TI&gl>35U=KQ4AW!7bdEqs#w? z-^3){-t+To7O19?|M={tqMCwrBa7r;4gK5b3?~A2-ws27|04kT+kd&iyrQM0Jv+G| zAzTJIyEvl|qcpCptIHb*fuUif%{eHBqxn8^NIlrWGZMr9tqqpfV^eo_P^XPYl5!+A z#W=zQIHUQqM)KE%ZWwUG-h3j&e{@lX3UUIUJ;N;|M6%}iieC1Plp75GOj8UEEv?j) zkia}N9guP!$vDN@jO#!g-Zw3KgoBOxZS@yL}P#4O7wNQh`LYLb5i|1bBYf0;Vb z(00E%fsVg@obd-}O9t$pbHZmyoQSsWTsB)nP2+tmprom&sVS}`=pd({AT86W;H$%r z#QFBEytpbEXH(kbo!r*mdCr% z0W_~CHuIm4@9*8*n?L?#rVNf6=>B>C-(&7G3=q{kLe>zEvzr(2xZG<$SgUGiaO1G* z!T5`HN5;n^_Q2zdh#?&PEc%T5k8l6_Gd@?Sqxi_CpSY|4%Y))WAhdE(fEt?|GYJ$Q zVe`w%vRgh`WH)jx7F>d`X5zd3@MZq+-~aFq1o#SZCN2-S)IY*({tRc4uDlPm?ZaO1SRUB*m2FjJHCF4}9{6={L9_}>5cMRw5 zQJ7&fxQO%I$vz_iL0COGf}n)2ga-Z0U@(NgI}8NE#-^F<=H#VAZif8u=k1YIs<6biJXHUX z23m~W<3ci1@p?#f^MU$|+|snQ@vuOa3P1~HhDap@WB&x%-o~*uTk!N@>~(0^1Iz%@ zxoMHBn`=y!{kbL$?O;KDetF5zhkwp_5b!x^V0m&P6$1N5mjhF>{pZgQ3`M0=4<9|9 z)w!*em$|JoQpN(n65p5$BiRzn_hbw0y z4rS@+n2hqO26j@@W#skL-iK!!wCpBPM~Nmcy=Bc6@v^c-=RI3~q(93;gw80+6^=~K z)(T}IH`xD)cjxjRWpWZ1Q;h2JhD&#pDI_RFsY+gka_lIzt>F5vGn&619`79BS=Kep z+WBX9X7nLL!61;Ta4hD!I!z@KaC}NT@h9~)9gm_rv#HHvuHZ8yZARy5v7L-lg$@)se$(Ah@i2yl-){IIxWrvV>?o8r&yA+og z96s>dG`L#DZeMB4tzh@)0kNK97za>Sk!wX_BnugG7ow%Iq&8dOI+*ls;fht7gl2?6 zk0oW_A1pNMAMX)x!_A7Ifjg87a$yYl^#e9>J&L5!vAp15V!%P78X-)*MH5 zR}XdVQr`LBvAZ)eP5I=7wxE#)QN+>-V{v97rUjNDX@Uozioukj{S>geSh(!kttnfl zmUf94RnI+9&p_9>aeWKL2zgXF(D6;Mu+V%|IWJmLs~)LE$`*C)5KySBx%|>OFOrxb z#D*TL6chRxU*vV;hi6@mBnn|zu+xv9}6+|ahOOyHyPsklS7Tva@nwo$Z!r|fAZR-9?^Q))R-0{lWxR_4U zr+Ox8s2e>M2+t~3rLAQy%CEWIuc3bWsK5$zO09ANC5DIQXE@ImQfWpWFzdB<4n4Zm zCiPFgCT@@OE-eLK<-{M3pK6Q@zRN}rmR3=wf~3~9P#eA4N5 z+*4e?cs~a)X8y35e3fpf=Gzf%xS1kQ+|V~iXlaOV{rvTnmFan56=6Ht-H6v_T;3+n zxcg)>hZe4}rfXtShCYZomF3DuJ8plE8dSPevTjtWFc!2Unp~E4rxSY2n_^@DpTnvS^-q;VKz0;Hy>xLyFRpmc!610 z%KVme`G>fSqJgPE*dGKbYyF!?3IyPj%%2qGew|T|2sU>%EUFk(3I?uMWkt?w57|UCd)^fx zs@@BIB_mU;+#na(fqj6qgfTp=6y4h04rR{z=$LH2d}x#wS@H&Bb^8Y`1O1eUh6YPE zX__1_xFdUaKGCoG<`o!~@GE>|DnDerUlR%!U?7||=E$qqCcRTrv1)3I6l_e%UV`mL zoq4CINND2oEG1cc`KjCQGKw`YVm;FMP2~eXq^1qeVmPGW@4S5Yq{)ikAGRa$GYKZw zD@vN2QR)i~u>!_R%+6oUyD{02FTj7{;M%SN10ODNM4^^xXt|9~X?0acx|*flX;%{G zvYXVPSVA>TkSiqMiqySq_V{p*?`XJM&ZE_qOD$0dDlDc#UmfC;~H!oD89r=86098>@m03V4G!8BZI_MX_Qiet(EHVh{`fC!)qqPp%gK$-? zF9YwF6UtXY6cL$9>)(EQxa}YCXgF{ftNQ-z$IDlaDDfk4S9Az(17ueoMLv^uBwTw-sLR40FdpRQj~>S zF&}+8y{-P*p`UE-DjbZ$EVKp1St&hd3Cd31E7p1!m%JZDRNq=`^r<9~ zthEQI@-r97&M8_d{rZjfdc|_zWf%#97=AxVef8h%8i3aJJQ4-mjH4R`IANX@7#*t zAD$rF-TkIzsiKyr@|!;YIu-yfnS}^anlen0tJuPkPv$36Z)uEdNq!yM3=e-T(*=ctU@+E` zB!z>gW8zMbb=wQ}mzDbKh3669%j2J*(n0?A_#I#%50B(@bbQ^GN7R^H3qn+Tgz5`= zoDIeIEpr334e`k-$$7Qkqo*Fr%W75*C-(ya!@iegiS#p@J-cE6Ikkg`%kpdEO*~0) z-U%Yz^ocN_5p$n1P1n&;s0YChi7!1IG0)tP=k$1G^x&?AmWnqwPlYDxnYVp$HnkGx zKBex-kSIt?eDFOZg|OC`Pj2uj9gJ_gvxg2oO%6CTzD{TkRr^Q+n*zxEG^boh5K`@+ zrcW#zhVeTX-?{8|ua2)S&CGx@khpPV@}H-p>fruGZeKy!FnboyzuVo5(RKO5x7^tT z+fsL;cXW1?`>Fx~2F<;pEFvN_I{9XMU^eG_j%_?)hW|<{(@Q9rJ^}6E#N5zCOHFZf zaoS+j%6L1pmP54m<*8b?Zkszr3~A4!GpDISaK6O}>TKLsyO*+K$&cq&qP@!CAef&vnxY5d@4qvG$5{PPlz>v?28&nW z42GSN_hcV1Kl_Zhw=OZYRgk}k%2Wl-Sk^cENEMG+JjEJ2gPlfFk>$NW{!_8$M@dnS zmp6Y#>Ks**4Zl&56T#MYeoj?jSs4%Nu6d(`s`N)nsvDk#&bjFN{!d2hn_p?c(Z!mt zINSv=XXmStiVY3*^dvunWZuzdAB@6#G5yO%CPR8wKP&D#!g}TW%d?Mu0s{dN+&KfE z9;*$UprB)m2270&PK6F*Y!?juBg9xC`+4t@#-xM}>sZx ztds~=Cs$^TMPy7O8kU#}!AtU9DXQ3MQ#CoxD_NoBo)2O9t81-4nI&ThKBY>1q5J^5 zfZ!gYEFh1wRH@0u{LN({v4hy5j$<_IjXz>A+TPv>wlU4Q8+*h@TR4tz5Ck=R5q|7& zNG^Z>;sC~7ZBI_o0a`_FWU5s3kAl8rU^vE$E{<~(eqf`A7zi@^@yP)>gdz?uAFei3lyfd%japa`H-+*gZW3-YU?u%VWa;ncI<^e1^p$P0A%DM z`Q{%0TlPe z?9>+(Hg>O>f;RbS*zEj7h<@ax-7w-oJ`ew_div#9AycmCj}?B9k!gr;)#%>JxK$p0 zE*Ag3EWP9Jr&Ph2LV9r>L+lqU;*aPqXFbsOG30oA^{p=$RdPJ?w)waqzok%-k_e2t zJAd@Sc8R!%Y_XCciLz{ZE(vqccJrp8UGOcr^?C$?ripaMJB$xeElP}UFy9;RQB;)5 zSy)C=G5E3uUJBe;R3I8ucCl@=1L|ToN4c!CJ?MTLVca-YRZcS8rB<5uSX2z@koyy# zt`Do9c4X>V2T+e!3PL<}QF>cONfZv)8KbKJ!lvp!a@PNFMm>)NUbN@gTRMc_70E}S zM<6vvGC_1qHgXMx->jG>IyzY(F!$ST@0f$wM@jRT=+IC&$yBzm?r=Ow9-gI*^+O@J z&`_Y4Ln=2)-e{Y^d1qxcO9!R>qK^Z=bD|?fI22ooUWbN$ED~@Ngd81jqbYgjtB=2f z`iE6=U|6Gdhv4&DdPDTSOv<}>OicTcnR&}ZY90}S#q5U~cv!hIhjJV(kWYHjL}zA$F5xZL8ei!{ejj7P!38 z&Is)HesCIAq8u&_(LdpBSwmSAOz)DT}V%;eD zsB*SA3f~Khu4b7q2o!8HMq2KqR85$;ou_Po7RqS7Ww(~kC-0{Vrk4!zn6?ZocHh+- z)S2EBeB*w`55eR91`%X1TcQbjdVCxh6i z#yDbG#t~&BUM>4NVCb2r6vKw0VJbZbHfrR6i)+hpznN2ElK)vL?)f%eHLl0G11%Ju== zIb?+k-R$8!Hwy4ua`4J0FJej9qtzAO388yx3~x{i&{v|Ht!nP01PZbaVqv{)5-a8N zDw4C9qwa(%V0kw-DNn42@AjW`#b2==pZ!}cX6r49iU#`EuU}g&K|@0?T0X_2yeOv& z$Cskc;y2G+&GYX3I_P4D^G|iNsZmKH2;6r}+^4;ud!$X;oal%T#}l->4FqlsRC33V za0k)=wK0ODQ{r~{Cn%Vur|p&vh`KqYs1>+N$fJf}u7yi=G~@hUxLMYvJ2E}201&gr zC+tLC^Wwt06%uLLuPT1k2@>b}=iK&GQMnApU%&2Fu`W%au$^>oRY*SynRV6}E=0F+ zHQzpos65V2e~lp{aE=fT#mrg45nnjX^(W_TVW+9ijxY0AX>&d%g@jzEudg}2@m^9X z`__E30a}KnEo3}xn*RK79fdA$V{e`1eAMV$%PU{4y>5Q-)beaR2A6g2xWy%n9`UeS zteTzfH*L_bWOKGg`78o}fXl^NW(=J+y9^{g#oZ=Vn`EIKyQV8{j|Uq}eA_QZKk5oS z-|Bw|d)VhCn7D&Wx|jocJRZly60UoWT+bdS3Px=hP50i`yUvDg{CsOh|Jh)_dU^K| z;WJR^t}4?>F!*8L@$;3t`=JmF!kd_`aIUiCZ&JDO`R|uU5EPrKi{S-UzJ0vrzVK1G zR!hqmfBh!z>FUf1=u_c59$0=fNPP%K4I;O#oDNrXCwk__;jy9PzB_Rxb+@-WTs63m z3ch}vj7!a)i6dS0%L}k@k~g`+a$gi#6NBiyD)FHXPC zyy$d}9HXqS&vJSWjCYD4>zG~dLS5a>s495|iiT&o1nt!_&N|SKJXT$VyM{lG%2X6Qu5gDFeF%0~BCL>uU*)6S}3^j`aw?tP3mvDM@AAHJ$^ zFb7Q3P%+7H<(1aNiTk|LI~-{tUtEU)A+*2;n?V6_*D6BELwUx}-d60D-mjw8Bx$Ks zae$CpYQ)}b} zA>C|nn~z%uyeg7Rq>IHz#z&pGQ7F$KY+D|QGi!8kuJu7dCcNDLE8KMR%7- z*2gDqBnN}InJCYmo=7rp$yMz6IkXw4E+HOA72D(RfsQ8w$=`vtZMNic_k!+NHQesH+2t9x&Ln zBQWc-6Ty~c3w!_hs3#OFI|xaM>D2Sa_0D#}T&%3o&krov{=^I^kyybGN6D$9ikgdB z32;Ji7FM=cSF=64#15!+`oEu6?zyMc+$<_4N~E%BkSgC?%unHov80SJDsYayRSIa! z%v02G4!%0#&5N~gh3%RL?v94z9Hef2iMD6tGQ2K1 zSL+G-g+48B+v1g<4j9eDV>owoLJakOSNDg3f~%gFXjxKV`2M&jts0TUg2$ZUX*+9j zPxuxS={kiKOO^3R6^Z0z_qHd^vCJ3K^BxnIRrK&{@C@DNkfWe(hF7^V9=Xnlb%6g> zVs^Z`TLKLic=(7mIBXYGa@w~o^B7jap;%ULWbdS z8jlTkVQNeUeoM|;GX|s5|IYH-rEVHs@J}fakmi}zWIGj*Q z?9e(nW=V?6C9}MN)9qdo5f1<9%QS1hf{13!C2iBm_}~vEn~6qplB@)E8spGXb=Bto zY)mA)a>i^tEw8LxSJ;m)p!F{S>z{Q3!qMN_%_mYZw|;A9Xo_!@USs0&r=!#J5APg6 z*;E@Yeq^U<(lIM8*70^LSzvo~d@K>G9y7MJ4IQ+%C{-yG{*?)`!wvcWQK$iZ7l? zJ9!DW>XP?q!`kVy$=P{sj&KdBsiU!xINkb?X4gJ{7~&gD6cX}tt+;2uqzW-C&5~sI zz(#5c>KKzMy*ZmtpU_;dx>y;4eKE6ycUa=9Z08cIe=?Tj7k@j(cSh3U52273ptGpU z%F6ojRsXyWFT8`mZCg?q02eGgY+2>ng)nPCz47t}(W^OV^X#I{37M|AJ1?2k;TbE5 zf42;mEp4p`Kc9~2|Ak(Ey*ngYo3z$sLjTbMF4oNtmqq7#>9IS9NYIcRe9)q2c(K1| zDW*$Qd6u1Fmgj z{BP7v@~z_ESXZxKt25bM^rC-?cQzCa7&M54Oe1DB5LpW^=!zl@llO&h=2`kW17GFE zpD7Wb!KMb0l%2|MZiZuKfdfk^h@;k|)vRsTaGZePKA7O&!1)sHUCzcA7%QRUqvz|J z&Skb3m7p6Ux0pVr95r5&vVZo;Dau{~8oczQ27Nm8eEc9LZY*_o03Q*_KWTI>`eS_r zQCHWym-xpt(#0*-#g7bGf;X$a-ie(Rp1zIf)8OM$>8pQDk^d$7+%Z7Q1NUX0_R?<) zJpgs`C~jTn;->mc3rSifW|b$UtOD@^nJ#Y9*G) z=9wnyAC8-qwRTZ|)!EbsKd)p#1H`*7lS{LL0>-gPapsj`S{^NIb;b7;Ujm?%%hrYz zL#G&HcMlJ<^()ANCjV4+4`CQI0vx6Oph9XBOZ0+?jU*PFOH}4VH%%J`Bf57`{7~lQ6^N~J$HK$BW0+(<1^7Q4rN6W3CEUF9BlYtwsPK- z@h(-2n3a`v4bDPvVvB-o2X4ReTH|!9bqRC^P0i$N^-nGU9$-ulp$|lZkAeS2v_jOP zrKlI^8W^j2DZ&l`C2L$AbsER^NVdSwR-6PJpZO>A=KIK-&g;6FTZZ#<&i!NJxA8t|2_4z&$N=JPSt8;sj0232Y-SK8Gop7pmtl>wv?dJ)~)(zMuM2T$vVg=~or$BKLxZU?u91Cmw= z46Z*n_akf>nI8};j^+{aJL}AKPvuZg7|Ey5wmfM#eW2zv>&8>sUeS09TumHjDvFbAt zr<}coT3evHPk+?Z$OV^6cq}f~|I@|IOeCDy|BK8UiMQ`5lho(Vp>G96)+K-b)JtQJ z%8pgtOE@QeprqvyJd#|4g734u5#>rj&x|@aP+K)36mRyIja=QP7A*xjPdBBxiGANU zBHBH>A9Q{cLp*-dvi;C(klYu&%FUx*CAa9Kh_NV^+1RMe)ZP+@JD0_5ZENIqg(jIQ zMRjRb$x>aN+*Ek*po<`x#PRWI_~bZ@*eij-sIjoWMe%_Pwumt;V|C{L7wIK2K%|%M zzWm-xxuXr{;#*+PqrRBvY-J~1f@$9Tp2h9J@KZ$k0 z{aMp$%$Lb|3cOPr{pQ2{_`BfUA~Z_XeX)`SC|>ivEY)Thcxs>?wF*BgybA*K3<9Cr?val*^~)x!g7O*qBVjzcRPB4PMhEzj%R z6qWSTIox`KUuI;~4MDG*(jU1QClRJ~3y?u#+B0<$s(&^RaT@m^pl6p7db;zHNn(oZ zvzib~BiJ+B^mh-bhF(o2jEwGpML_>cr`KO z6E%P7RLYzo1Eg1J<*a&h6AN=3bD@e?A4U@`cYLLv?o%INagYrvIsDaS3Y(i#mmH5l zb?om<-fU@#jmaX3l{p<^;7C5|=#n$NRT`QgJv)D6I7yZ^F)`9q2*b9v2Jy9^lETzT zUsojD#CD+%r3b61V-+?!^dKUFFw3?wq5r=9ID}=vyIM+hJl0_g|L90gt9@PX%a?I? z-lxIum~BGqAJeJN89y61L@9Z6ahf-qs)PW&$I{i+htsJ*d>SmlrY36KO+*rnh^FG{ zAA5M)h*K15uH^Rc!RrFC?RLVK&eL@5ri|eL+WFHgQF|_?iUF@+$EhX4|GQ!@hN|hZ zPe=VXLj?*w*kV#Vt9-t-SNJBUkE0RGd1Vx-s@YEW`6loK^D^BkwE%?S{?~ztaYj+g zXI`fbi(N-PRkQfdEXqJGX&zUH@Kgc$@n(XyoN`Iwc|yIWYKG})BBciA`dNCyTAKGO z+xI0`v9BC4Ouj}INU6v(9Uq(}23FM)08TC0uoKZXbQHXgvXRu_=>5rTKRZvf1*7ND zr(N$6`nZk+*)x_i<>VoF)3(zbCEV5^;ORaUO}dD4S#yVxp$vwx>;JT<*epUT@AY6W zKlN*=qr)Q+B1bUZzk2>rqZwcrErT96oFbW;im#trwNWqh^)}TN@@FOBaaB#Qkg`D0 zLYq+KonUCNld}36->Cao)4^W0UvivdojLppP5sLZ0i{(+u(@YyTTLQw+uzly4Tq;J ziT_wTVqlglZ-UKHRxftiGo7y7*BFC?(P%s@(;3CG6FOfpmwa! zL-xG=)s1z}+YM&#TU$;UXR4gz7bGYZ!(#VB}faRgPWCHB_(bbG>U{;Os~3G zua5w2L>esKmc(+Fkzol|meImI^5SMFW#{0)JZwiEbXdQupl$hdZ%}jH-L8I;b0Qzk z`{gs!Y1j0!tf^_y!G3j;Ina$`X=RmZT-+=-rF+C_e<<5yZr+YOqBcO!K)kSl4McuI z7$XVUQe(pb*IxB^5LF96mzpGH;M^R?ZR%MQ;Og~VM|C(XxDAAgF*ez23^7G&Wpn`P zIX#Mz)l^RN$PE6FPifYxutquD;sh>IPD) z+UK=IDQdVuQ{YRpn9k}K)-SaXY~RC%!h8H%%gA44i=8Ym6M()pHc7RiprC+?hMb&E z5l-)S)u8^NbtXp-LsH0GNd)6OH$SF7PJ>Ie*4h5u5|;r|YiWihfQcp^pE`S6kwlKe z_!W#=y*wT@98B%{lJ)uH<|djLtJS#^P%t=46+}V}9Fo1l*U~i>Y;0o#w6W99Q-jcQ zh85N3#!a8khxa9UGOX?FKRduDNQ2>&49+euGw8EK0`A~C0k{D%N&C*6F*?wxvj8$u zQ&^a+;rd9R6ICk~dya4gl5XN*_2ASM>?!BT`gOLUEo4{z3xP{el63ZY^6Yyd&4aJ0 z+iYfoqETTP|DkieK=A$ap`R^rSBXtue(jeok48&@PXlJyQ&$2E* z=S};MD>@f%-w)p6)e4w6RT%nV(M=~OtI=<(+!o%bD>d$j-7cL}C@wW|oWjE6^Sp0F zV#?R%T2NEp0Xfwu_4W0MXu@NJjT&L6rPbWB?)7^`bh6^+7bHV;kdaxQ`HcMqID1 zXc;fcvlj3NsWR8oN&B<>hn2F%F3z6)$0Pr=XcIO5bP>ef5o7pH|Ni{q9x_?7R~dqE<2>m z+TDWtUfeA!1`Hj%ZE_kW{?Z0`Kw0$_)08Il+6W+xMseR_r4XQ`p@R-NEdn&$E|2@E z!6CuLq+xKqT9YROB&|~41VdNatzS-$J~-B&pdj!7>Bt;CLjZsWaNwoaNs?_ju3yoH z)5ZzBE~c~YR;b?&Q~g=Lg^UZb*72!8RiRD=m}RrD@sUr}p(hRhTT*)Lmn}jcF#F}Q zkQ}DE?&+}H@77&@chP{EU+mG{pE;L!iYFApE zIvc)DIPX45sagDDhq;94zFy=${^(vGC6EM$wy+XOmMY)%mI~id&=%X^;^v#oS&K_lpTNrBend77GlBfQiM|PoY(F+YkJ9{K}gZ_ z_0vUblf7&qB6~a|`nSS|6_T}W?Lok~Td>@hqo`h?S0c1o9G?$`%iZdN!{(#qy03M5 zZkf~^ui-8HbPR_Q>)`ib-o31$LDTSbH_u!NMD=j~vd6rD^9aMERD1ICEN;@JqjRFY zqBmewQ17a}i**;R?!CuS7_te(?z{Zypk9+jT=k1meCl-!>$-XNA% z@e%C&3B#fi@L49X3+v?`@F2`z<$9mU! zpKjNUf|HYQ4i}!QXtL-w+<1FCv157sJ^;db|7kOZHH^Uh4!nLVpVDw|1A4sTRoaeX z$i6uS5ed)Jh4^gvx8)^D^N8|mNO;TER2+15=Csf5IrFUxm5w+7+-pF7^#DtNlPA1m zE$Bv<%y50Hh?Lc<1tqEEz*1}62Pjmdb-wr7S*rUnK#BO|QCr3TFaVV)QbUKX=iF)9_=)ZN*Np<@E){hK62 z$diViW3V?U(N1FSKza3|9cTqG#-K(_g@JfKd!_=QzsOLc3^!YNGfjX@CRPO*yl=*8 zL-F*?ir+l%>0q!NA%kqAAl2OHucVqx%pB7=AnPR<=`jJrgm^~3Q;3ybsz zylp!8Enuem=mO>+2l&rj{O9g^Hor6$-p!%(I05ZAPI#WFM?`HuK~GPwa_Eri+k}(j zx8an+q?bQiqnRChgMju840z8BaR(#K*fvc$=*9?wp6r?}t>}+=QCK43%<2M0x}#r>fj1;Do(}f)rJN}`dl7B^5m1k=e;t6 zEm|6Pfv}O>vs;^H_Vw*fB2XYM`;O=E6Ni$OF+HnQk*sLf%QmBj9FIXr@ ze1=%4e|KrU06f+T^Y5#>6AO0prKSw!!Zd-ZftD3^S8FDW)$|t3RyAaCxkB}_xI8FG zY)v|7X5omOlRzKW&BK@EKv>gRZYf?%=d9Cm583KNeArY-8j3URinPI89gj7;rsexI z>8&J2bP7zA_wmNMg&~6RCq2n!{$AexVetjyISg*i(CzmE&V?k)p;KG*c7vi6!YfV( zmfwq}W=Bek&IP#tx#fRzB7wUGXaxWsh(KvLYlz=3c$$4!xzc0pAAQ}Z?K+ThEmnfk zozs)MW}rd$34L=LLv#eKdylB(8gZxJUiTLep3iDB zLZNU&tC?yGc)e}1*OM|r%G8qzleVf7@KSagYx=a?it_5xXxYqrYDK1neG?)W*oCKs zC*-k;8L>ov!sGr5vj|74UhY)o2@~&+8ln@I=c4nqI6p|kh5N};0}w(Uqd2RLsu+sW zaXngSpAZJq0zSD)t#pcgKBnXGKeqKsXRcQt?1rpu`x7y5cr zn3?1?E}z^Y&0VXOt4u8-3wHYhY+8bwm0?ejQoO|+=~81I^MPiX#V917KmQ!(eJYot z7W`9z{s$-pfLZ|9P}KuH#~2DC1k|GG`DI?d+ zJYZ2rbD?i;A;-TPVdTR~;q!v|^vAZPOQVpN zU1W ziUk$rKx(yl7?tXd=6y+qLRlD!f!Gg;kO_2aD?1`uT7s&tuCAb)TgkG=&SLFzb3u2Z zP;XlZ?X9jYiH*xM&&ILe_ZOspzrlS^YsRhc?cLoDMI)W`uTn@1g?xhkYfa&T0t9F{ z{8pk#xVgP4)4%)S?Ck1Le*ZYH>#X~+=^Uc}h#l~NS56k*-tGtS%0 zE1V$o$?3L#NU}mFJEFBTMNVURR5Z;@G6QJgiKe>baEl-qBETR81Km`3*9i$K$o*xu zlIS%Paer|0a*UKT4Yn|qgI0r<;VYn1f5P7Vd!KU$fuL{eS~dG)@8axmsb~<=l4cyA zhQcjs?*8eQ@jEx zDn1b8+zIpiA|8C#KoMHt+Jz<_?bmCNh!!?hIoc#WNam?W%N1Fm!hCTOgbO1v#mT7r z@6edXqxeEkpy)&$#Guge5kR={c7=&J95xF`gtdhr>&1{joe4yTf21d`y)V1fq~yki zg}x?qmnN&%7OuQ-IZ4x$#yTWvU;gAI540G1=fGcKm>wD_gdo7dUw?yDnldz ziv;>_)w$lsPaR0*`gK=0xegH!2m_6-WRw}XBwu@igj-q)R zZQi{=!K6z}%^OY;M-KbvyT4@x<4wNF5b;9v-gr}jVt^Ca=)*@uHyHKMvC#K1I*CF2 zLOb7lat6>U|?1C1RD%b>7) z-Kl}V5)gW7LqtcX|Ey%K<`;TnDGkx&+QYVs);8ClsPRae3N#uRo=4)|wWxMSkobRr zvdQupl&ivl-=}jIh({&q%#8`KP5wUKzjXqO8?+`J2mhU48{cN}f}F#qzI2if_3L&@ z^3B0v3WFL1g6e0vEY`az0_pK3>OO{&4?Z1qdL3lG;`9PpCsJj5mxs|wvg4UwMWb2S z8)j>I6&Z$W!cp!SC<^*;gtGa2!+>ilmvb!a3c3^bIU)Z>CpQh?5;BZ$b!~n*gPu~v zh`8ANK=Ydd08tfzKR)~}d%s23xca=>Ee{}eC`uu{j-N&2yug~nVJw*6i{2Q@BV*uH z39ruTRL$_EG4-Y?CDUnpq{;FN{5UC&P?e*;U#a^NFl2Yt7?G+;)CHv`BlDSri|uEm zKilLnStE-fIP|o1c*v`)C zoy)UhcDHnSg+J&O&C1>vas2iQ5B4|6ILn{{T)nDL7>z>YuOK;%tLlTjrTA9Tk&yFz zi8FixWzM4SRV=@07>hN_%e$+glQ+I2XCYsR0%^p1;bm2s@SRA;*x011=x|lf?#(n> z*4Q#~-`Lbga(Bv4K_a5KgM0JV7|Bkz%~W?c94;{0soW!;nOJ48ay)m;b8X z|MtT51wQV2yQ_QnUl#~RA)#(=?&M9L*(@2JsScOVoe7jIr)kS7<(5%A?S!esv?{8` z4vvi9mu`C-=Ln7EVVYyH@XP-sHp&kNn5mlT`mxvWE=h@5M&*K~ z)PONhh1-kZ=d{&K`#zd^+0`P#_VWG1w0)TaOp?cjcA*kEg8 zvgA=+g?4oBO9oz@xcBv|2~$&B{voK5D~Lf7%iX25YKv|-5+79v5)w&x4_N7P4% zoTel@v3|?I^6-NE?Aq|^i`LA!a#xn8Hb2hMVoDM>t4lR=f`p?p-9dhih9;P{(o)p1 zvSI07)ghDFXQr-DXrgBsgj>!{oCDzpEDri)tC8q&R?2IcGN=I{DKX|><`xP0-@8LN z+VpaSn$i&Tf4ydr3Wkeki!-ggD%(k5jXq&cc=qXTA_ zd2%#DW@InWJcb0I0Cbs_krQs;4Xu)npHq_a6m=pmUfu9u`%VY)y0O3GEf#=9M&1;P z^nM^WGl61fn~QW0;8b^;Aiul0JREoSDg#%|M9_UC{uN7?evfPj-#X*E9q=#q0x&H= zz&GY;W)%~ttVh}fWydnLv8%JJ%~T%zezJKnh0_ezHUdAMoc2df6l8_rW3K=1VlIoE zuv~_kP$?qC4Oo4(kx=YTmLzBf@_!pD0FICB;qOD!72fu%x66^(8ms9}Oldsf!LC9fO-{v)qIV8{iM(-OJc$gcJFSBXX3p#zDDK~s>`&_9!Z*N+Ayzd!9W zGySBTt+hk;^paDr^`Ya%$Ra5({?gWIk);>gPX(~K6`it|H+&?1%O4P4FA^d#d{&WZ?r8WLMBxBDVy&qf6BXg1M)NKSGed#jZP8FX158 z2z1520kJfs2{U%TxYi=RrAo#A$YTb-m)N9+w=?D|7|;b{ducHF5GLwUMG^y8mh3p6 zo)T;^DhWE9@>N=v)e_XTfaeB1Sh(Pey#OPdBp!1I2L^Sg4yd&V*v|qU8SyDi)LpR9 z=|<;}eT59Gvzcrq$}3qv*9+d=jb8cx3asH9Ash|zX)&Mz`L{a-7Wx+K#dCswbnWX| z^rXSZBj){4x4H4fT+j_)ib0{{xjH$A!tx1q_jpeG4GrK=xj)%>nI%o6aj75fUIpJx z3}JN3Nm(*8GbLy9A*r;t4L44Ez$d9;*qD&rAfTtW^uCJijws z&&0wseob(YRYAPqOAol7-FHI2MkajMqyUr7;{C0b-G8gymrfo7D1~X3QA$m`48cC3 zy+jh9lh);lKmf^ZIGOYI?oumOWhyf8rV`m{Z5_1o@p-lZ;ifj9@^oFKNj!^YHrBMS zNmo~wZV2Sp!w@DAP5yApm9|@s}_@J5+zlM~-(bNt| zem(|%`%JFP-7*I{A+j|#7Q?IqI5d+!~|-6ARzn3GF5&Q8e`R1LO_6te(Rf~dq*MH z?&bA8v-+c$aiU~I=S`>)7hOAv;5#B_F`YpxG=5US50ZM`3USOqG?R2Q49KpqS1Of) zuU>;8^8NJ#)BSa<3FfnNE7Wgqc8jiL5j^I(>0=|U;6j@J~z^K zhi+q7NjPdb3l|4|Op>u4hoQ86;(sm^th$GXPezg@#LL=wgu@uJ1R71`%#Qi{_=NOP z?PHO;t6C>#UbVPEm2XpvCtM#@zl0z{R~an4sHZ0gNAT+%Kxxm{ioX4X>IG z)Oar^FTYt>G5l?|!eG8xM@MI)HLhfgPkLLf&C{Jm&Rn*tJ&)CI_qsQ zIk|7P6jW5vl1VImSBLY?X&bUp$;niTYL>oL(&FM#D=S(*^710SeM8=F0T_B^qcTu0 zl^g7exHkbF?z3@m+Dm6AU~2cyu|P@Dk^9qmn(4hbZIi+aiQ44kBmfA0nw%<9sp?;% zd~DiLL%`=EzrQ-Hc&e(Zs+N?IiC`XE4sy%P$|?%1c78bR$;rh1o@YngNP*c6mnNhWxzZS}e6EYO(|y~#&yE1;*{+=n9Vfsh7GdtPj+5z$I5aeL zmiBy`*5rkBF_X)4NpZU)!aG+WjyD195$&|5dlQ~<353Rb8x2i>kntS@L;3s|g?vsg zIEI?mzJ}u_+U@O#I}I=kY;n%vh)T10L1SXo!r`+jE!><^i(3<%#Z4Q68zI2CyEwNq z+{621i362>eonPl#1GCh9DtWg!WnJ8Kr83s~3J!TxEA+_=JC;hB zIPIpB%p~n)=4yj^Q!|9>&J45YMzH2XrpZF>n5!D=&*!yZ+Un{1J;j!u;+(fhsC08u9$N{EP<2GwQ!c;Bw;W%BabR zP^eVaewB}qWnQ}qQ3r6Y9SYjH&TCXa?% zWYY#VXOtiew>%!2&p&Z zJEtxgtM)j~>c!RV1M|qWD};6~nL9kMFtD+|deZ}Zii9sylA9nv4Yhi8@`Ty@u|Dm8o0{FtDGlkQB4i>Jy2;q1dpg9D1>Zcyv zpSImMs^`u2(ekvVug?7Sl|~2Auw~K{2$)cOj;=q^)b9{q6AjsoRqSv-UAsTq<2a;C z-Kom5HXU!LIu{SsW_Usar0E4a$71fhdl|~4O!7YZS);9Jm!l!L&!+^>M1X#mV}ibR)hb4~c)sc3?SG+uKMYC?1T~4}5#TYAuNqamnF#V*goZxy=f^hB}OIgx5 zju(=S(9v>PWIn40!ZmMX;iK;~x(R+qd3Uma7Lq=T>2_J5IV*vbx^1Y5trVG%V6^-+ zO~2&0osueP(%NdkbB@Jn&irs_?oJ8tZz|QWB)al5k{A;D^3+aycs)NIKik!eIT~4V zq+}+5GmUms?A$H`4AMdsbUPhxmy_=ZAyiXcuat2j(hr$QK4`v%b~;v5CSn?0AI%VK zqRDs-eh2(1`wf5I2kja@5V)0Ez#%B|)esp7rfnu~dDx_Fs1lcuKz)QWD)rU(7+ncp zY_PwsM@RdcVgIisCA7E$S+r(IbK^}8{7vn*mV!S4oYvPc!lP0I?hmJC1GGCGhh%9k z<*IaE)e}_U^VOykk~kp|k&)Upkaz3dIOaBxBpX{>a|f@N0G(j!q&~$L%v1Y3H{Co% ziOC-hjN}@p!CFo5Dc~W5-@SrhTQMP%QON(_r zs>@ZR^O|C1V(Kk%e>AR1pwV98Afus?(jQL#F=SHhpV|hcQnJ18?WQ=^>XQ)-jIOR_ zlKrC`cD9ZqBD!-@xI_SFx{cG>A5W2b+D;ueYRBFd$HulkI39Kw>j6s zZNISVReyqNPn`Ngm>EM;)2aalLuXgI5@oDLG`OkJ187ZPg1sqUKn;uQq|p|{wClt> za;DODRZHsW^y`NgpJ%Fb>Twmp-2zha!eqlyQ^W06uK`SGgr&Y@fU7o$<{dx(|5^~h zutcH}5^8_p-i3QvvlS+ACKL}E&r!u61qIdwpp&9m+v+=N}eRa(W&aZh3kJ>BEv!QB@9oi;5EJDbUN)EhlrlUC-rx{85X) zWW3C}VBx)BzwG+kTyB7@oMKwdI@AH;i^Hx?>w9%l?ft2u>J*xxi1_%K!{iuBMKNIV zOVPf09fT>}%yKY9qRju6Vm>XG7x$3BzBuUReA5ks01j0JiNoXN^rHEp`x;7G1mG22 zvzG%-{&iV-Im5M`JB};$^9q)zjEu~vCdQF&v0Y*pAvgEp6fgmz%hjb+*D7tLEJK-$ z=YDpipCp`%7+ZApef?V>ed-%vYz*x)U;)Sg!*;x}U_D}shkter3_Q^t8DlS0ttpZEP_oXoNg8?cME27S=cOi$=UaK5;=z5V^=189KUxR>^D zJ&)>P4|APMsAeZX1G7@N5w7Q^UiqgEAlG8=GQd%OE-Y=RcM)`RYu=YhTQ1haXX4|F z;~ibAv+*&2@NecAqX#%@=Q@gtiq^13fkxoCCN`U$h(|+pz^@((I*AN-`G8KVVUpy! z#h4aJty&HHb)nepQuTgn6Vt4ImozC<=k8)RbN2t(d&{V*+OU66krWUCDFH!RTDn0{ z8bP|dySp3d?k)-G?vn2AknZl9jXv>m9%t5n=G(0GeqpiC*=NUfU-`S@#*i*lra(kQ zJiCCUs#~;sKJ&MsaAiv4A>_zCc4@_;D!@bz9Xk#q7}T`dlKV=Esg>V8cs#vajPnYM z#0&=UY`FjIMGmRS1_K)$Ua8a!wijM!xG_tI&ec=da7r;00P&hGG%QSg8z}m3qs4cZ)~|2}e3c&OhrM|) z>r#a%$(3p>JDMSr8*nH>{+U8q8dIt1P^+eYYe%q2OL|=G;dFZ zc0$gK`yzGT%x=C(f>fHdU;kmbf`kUwtB&Lf^ zPwjvJV|VaczUG6+D@6Jg6fA0)mq%X#~fskz{L} ziC*vm^Pg=nIfeU<4nn1Hx{KT{Kg!9uEi6iRrptR6#<;vyZntF4EDnDpy1>lH;ILZn znBp8Ma;Vu40Zq+}zK|3YO+IvRT#?_VRtT4wP^q77d-f@3k92~S z{H=w!i5n(mci0REohYST)co}#`dC{G<4-HNE4dIv#*DlMr<9NLvkE(RW#yu?jQ2it z?_d7~P5c|ndOyUnZyBPwAH*|e5)6Uu!1a3frngu48ntoV7Zw(F4xyJ`p}Dg0)(8d` z_So>}{J1c9p7eL~{qxyD!q-X8S9%KHg;0PvXdwg`zMa&!bB7|Ms8))!5kxt50Q{_P z?sF*y;DxyqU&oa%#xLAtv4*?X4&?;q6*kDP^(Pvf)8TSQ8xE$)!6<$z%zO&w6bWn_ zQj1`hlpTq4J=w8hk$jzS`v7B@R~}a!0t1+*x5~=ss)1qK-_!e70~zNJ#uHe6vl*{s zN_DkBT>R_n3%bCK@|)^XtymcI@mYe{$obe+Jtou|NiGA0bsdsh&$v}cOSmfmKUkdZ zoFg9*zLk6B&8sru#Y|}LKhuePirRZp@%b;!s}8F>?)u;=n@=d&_;JimK<&gcnnbnw z)DAP;Z;HAgO(@*P87%_9R21MOiUYy24lN3~d|4+Xf-a^EgV&-!F5NK6Pz-2gw%o)kzGblCEp}YP1Ta!9+p%x}NIC0YVDPd<=}loCx~GrRw!03zhVBZ^~F;95*Qd z)R+SstxdNU0x@M_^(kAh(_fV4Ui_hh6P?xG9=h?B1HhWPjH=Uco54) z`iWBodHEHGh3h28RWg-gggFO#YLwULrZYyBUD!6WY90u53a-in3PU?jU+WeDD3h|! zseGK;66?ZcP@gL`FbL!FYNByIFHxF~p1v#C`2-&mZgGlhJ-r#_wQUN{ZegMLmoIAT zJC;e#(?4I7?v-i_Q~{CFY_#3o<@($Vh_3kC5d3-**L_$3G`cFLKf67Hj2F43xit^DR>04f%{f!DCPQL3f5ffuA9Y@S|Fxm*fO0s1+wW?+J#T581(Di=+<_uRq zZ&{MI5AGj-b^(Q{m3-(W`s8V&Mhg#%jGwSCFeIWB$w6et*6h3Fc=<{0#Mg@rF#-SJ z1N$8=XFD|Td1hxu!qe-5mOT=l*J63rE|D01^oH!pe^*Sy{!ToL z;A5N}qtIu8daT~U(CPMmtun}(e0+{(^6x0S#^Zxx#8Qzcdrm4-gA1Jrw8I3+2lTEaItxH1-tj?DdRWPYAwaMOdMAQs&c<~hX!V6i&Hhl71mP51FZwH_F`wS+a` zkOYtSY7Z!pkV$_pp5r_{=PcE1CE;4Q_Oc+LtD=Qgqn^9p^J+cnZx$~Up<>2YGM0^B zJ)NYmF+t4ks#y81nZ?`V;_Mh($>TKcblQN;z?Cupnf>Bs%_7gJsWpq;>u4~q15$sF zqd`-<&e6UV>kux;6nj(^+-fpjVl{W`*x@v;oCe>b;`+i*W2$5~k#Y7qy*$(q?A_gI zP%xhQ{FI6rvw=hmi|~~aQA%VVm=}lAbpGS< zqBvnT0Rk$kz2&jy%~HpNSh~YR~V3#w{jP8rv8aYUyQ?>`b$- zM{Q}d1|0X*YZt^8@ER}LVfQpZ#Vn!W2?o;Vg&^ABP;U`f9J49_1>&a-&CVLq;=xtY zD*aU3pRdmz3)GevgoDNpg-C6Ds%Z8D<;)boK4W`>wUvJi|F4MbOpKb!CZ)7|zU*%wsP>~3<#zexDCa>RG z*@-Nev_wlW_VjBgncQc`=Y#159XyTQil455VD^k9hcDQH>*z)Q+9zutwKg6KTeUNF z-adwLv{afMA0UQj6=+n_p{YTVqaT$qDJI8;uZ;C2_2?9VD$GG;hm|Q^C%K^pCmQ{o zjEjAwC!ZI;f>15iyb_7lr}DJ>X+3H#d2b$Z8g;@Jto^)R zj=d?O57{&tlFX5VU}THf-mmBsH^j)h#$MYYm(H;NVcMYO^llKL6k!|N`;`24Lj zeyQ<9EWDI;7c|U8Hqnkn4jra7>x$s{O~h2aVO+?8V#+h*jm~E&baa(g z;Q*X@-Vj5&Gz5$=8yF0L&7)3_B9j0c6^ z>|^JR1j4|=O-dDjVC6M-*Jw{!q=`%S353~cV}#xb>gj!{Y+cRNh~7<|@e;MjPET)5 ziVZF90-HIjXoqC@zkC)6T+VaPjclDEE-$5hqsX`|LAmNH$LkP_A9Cy6Jp=4R zrSGnx;pB1q5ciC0Rcm;}ky{9xZZvvwsOH9NPA>Qr*xBDr-`sut%wAb(mE?le!$ER& zI2L9Sl@U`)*GHLW+LtZUC0*La*Pm*xr>~1~5^)qPEjXU`N`T)ljLby&ZS6eGy)sTA zQlBvw2%r=b132Qsz1J<@elJywB^Uz7MM`fhZHKl%XMaCxU(lju3CDg$?T|3^gFX4; zros0@V0`B?EF^~f@X!y*5NvZ=zP3g7^{zD|~BeV(l`*sKTz+`^>|RRnio@ zvOd|+@8}58675Wxizi*&TH7u96#7Gw>B`j*r6-p%c|OvTxYSW#&+cVTWP`j7e%si8 zGr-iJ!35sroORa}I2nnIF$Jn0DORNBjD04eF}w+*9cQep{?N+fF*}o8`o(NZ%|=mj z!W_=&G+bq#aEWeBdZ9K?F6VXv>`G1W!q2;WmTUL7iJYOBjPzxlQD`q}ebD1y zF3rE$;nh?7zGFu`!4MqqB0MByX>Pw+IocY8A8&!x9c)D414$Y?D&i8*NxHjVxiB$1 z>~Wj55l_cPp`r-_m}~HW{f&=`^vGq!RaqN93|4ldldisAw70|u7}~IOZ!dB2G0lNw zohTG&%tbXDBaOVe>cYti6^$r@7=5@avJY-gk+6qc7I|H}dS9yI&Lyj9J8qb;rJIqH zRNcEkY4jq!C=i#Mj#O)rLemX68By^w^PFn6T2n5sINCRLk;Zz=hV6o?33r03`B@!S zAUga;3HKedR6*SuvUz)~4uGx1dGc9uV2$HK_~3sy5jjT58<)*GJ7btCHY#ll5A3`t z?Ze!bN786rNuKBnd&TDo4s_q8*o71%7n4pwBreOcQwdNiM^PTG?b^YIpl>lLU#E1w zkfY^rTspF&A!g@A(rDQsZgxB;53WzdKNT@LW4XTzB?N#x_Gh%>y*w9r1F@9%`zkWs z!?B0#wK0;{jPuR~iq6XzX+kvMw&19qo{&BHKXS~Q+aatQ%B2FurQ{b3_Ljb+n$I9i z^gzf^zT^`>e-cb`jLCZ3A}m*A9>-3#&M#MZoCA`LK*w>rYu)eA5mrQbh{k^bi@*Q4 zA)-LT!-rQNqs;_c?^ssE`?St2OpdF1o>$aUSe4V`+Z(y;8jkFNVLk~le1lr3l%UO- zgnHf(LZR>?%2s-6mrPnDoNQprv1o_on;Tq#`G8TLQvBZjz>R&LL+yHdx=Av14^i8c zsxKy0H`1+bRN;K366v-)TV9Sb^Th&IwUG7OT+#5Gi7Rowk`LVDKMJwWLhTEynDe?==hx zwoME7N$rPxdY{7Kl*-*e-eqi{8Fn#uniqqrowX>N^munb1&jXBT_j# ztv!^e_EXg+PbndIycVrG))JB(DXSMG?aq7{{s2dr(3U6#+Rt))QV`|RE{Ur;S7SBb z+Aj)^4`2bt*c^_w!cgr$e(@?K@k=x`#wzc!Uy$1a_Y(PXsR^7`1rU&s$o|B70Rs;o zJy=A&NiEuKpr0$k>#2X-ezo|9Ke(r8UDJ(TDp?sCkFWMOD<)9X}U~c@5j%!x$l#!atdN6fJQHrFV#kp-Ah#(Hk*L$1fV?WL({wz)?1+<-p}< zSZHAa__*Bw#6JuRlW4a;NDYdBX{L6K=0i0G>Z7Z>Hc>+W>0ct;Y><4&g?Ce|PU7|p zUMB06l)6eIe@jcIT6hj-LXkM2ob(kqQEpRn-RsMf!V2NhC3rnWQR5zzThKf+Q6T^! zgrCpT&_32kZW3Vci_K`Xwk&I-oph6TW)Fj8;)lcV3Qr~fRCf5Nit=CTxCX=YCN@q6 zO#-OHEzZtK@zC|Wsl?9~t-VpE*u*#Zr+r4|B!%)XRwrUIA!~Fp&~>#j1isMF5(=KM zveEH>jvDJZOk-h|mt-BxIkVN2ElQwg6bS3HMN;R^%p7|s1y2#CAWwyp@GWd@{OrRi zGJu7Z4y$YGt9uHIe2w5L&F2#kDaB$qW>FLyF~KqW@^)=jc4ke?xqOtdTtL?}C0{N? zeGTOuqS^;>={daGpy;0Ww3SJp3KJty=Srvd)+0uRJPvmY$zw67-hOZs2jCE9LaQ*{ zC;L|-h>tE#(dy;LH?|&oHw$jy= z%jrCX6dWz}`_*Q+mD3iL3r6&b@o&g5x`x6u*Cb@8RQL2euoxQPDV!E0Zm~B_Qoql= zbNDPNsLJIkOna{C%$p$0*ddsUxtfB}vE<%-+hBnKvJC4wHrkblsG{it^O4h3w*tD2SeCaij!5?W(ZXjKUGqZ3`U_ZNBp zKsf(cT|_XX3ltDlDXi}{I7kiiV$<nnYu%MGRo`xTJyZU$uy{Yt7sX$4Ii6;cheMHz zm@QBc68oAEmKLi-+xe?qI=lRyqivG3sv-=4=964I00w%In>jm`^)(y-H;=cHcI4Z7%{A8`Q%mqIp1umep zElC5GehQ+&_K*!TKx}4|)Gn)V{OpB*sBh76ApHKDjFfeTawe_y;^#Ju?-84cjz8+O zL)fh1GSEn*Yn{$&>b*BPG~pDd%#`XQI_8cbk9$Kkf`q?Xi=&{;e(G!&WrGkIyBJmg z2SXO{UE7Ex&p6C5Tq#xOUEwC{Vs?H_^^D>$G9Fa?+mDPqr>cD z=QJ&u2G4`zFz~1}5POWX;&O3;HG(({ZUU4kdSgnN#l^~5!trnOq?3u&mgXcnWMWf1 zZ5Ev8Ac?D{kJ)XXI`Q8wjg9QWT$$c=5MgqA$q_Y4F~sFu1oen9?OH`NWET`1PB$>m%EYIY2^_Xx~MOW2h0sO0?^IJPdN8%})w^R1tx>+u1o zjPc~pYv5YEQ8te{U&4H}0O;OaGIwoimMuB|(-J=bJHnD~ z{K2lCzP=>P>$Cob)Z9jacC|IQqI7*Vr~ue7u2S(uTzrIhOOoiMiVoYk%+5ijr*$p0 zLI)^WtUqyf!=k}}ydnd3o6ocp%U?aLw6KT3*R5}uyFcm&n~NYDh#M!fYHVlLjA2|W z-|73l1yq%u#u=$OSjVnJjc*$lra8^(MxhSwk5{}nUbJ^9R0U_xY1eeSm^=1?N{HSD z0}R{|8S>;HEl^px*)#~0$hT^D+F7cYm@0(^KqW}u(-lmd<7GqRH`Ct{EH>gL`m zZ=b%Y6E$@}toTMb?v(3urlZs+*ga(G0WK(Dt(_Oi#2H9sk1 zh@dC!9s6!*E^adylW4vPRVj$esIp| zVn3BzG`a%%&yqUWD;GFUF^}>`cEbr1<*3#1JP1jO?r}twjJ~g6asIqpSxwrQ!oGe) z1J?yu;oc&f#zu-KAPPDl!gXX>&&<@csIGR^>K(=AUD0)0v7w(Re;D&Isvkbb2f&ex zs0;7l(}#8*5*^N2g?!$Pc`Y32Qqt?d3x+0^Ygeiy6fak>w02rb&~&p*naxoCnUVg0 z%L86J#t<6HyjDk50Nst-ZH69+x>YE>bM`}v-dG!VT0uf9d~b>5Y}!Q zrgzR{3sMRh(xp^1qlN~#5KIUcmKzA#J?#u=_N)rbR^y88Z^-716oC|;xEdI$rCdPU zKS7?GkD51F(Ws2 z`h7lk&Pp#E49RlJmHt>__Vm_>;N!Wo>)ixnkbw3yk{=90an3cpQzIn)O2lXvB67^Z zT__E+p*!josU8uJdtSu2t&8a{3rEC$Nn8VtF+yhYh~7-HlN8T{lNtL3XQDyCI5Xgq zA)!rSs4g-~n@r?!poE0Hnz?j18P96g^dHP*s*AJ^v}BfY|4dx(y{*{*5})S-e(%l8 ze@ygm|A?rZ%R*w}*=k%|F2}mOjysAXA&a(p)_0pglQbtNCp$E=VE z9lcH9*bEb<0;`M5(9&&hEB;240?sH1lpT=3#d&YVV2+kb{K(e>;+A%yCR!fuQoah$ zq-8x51LRxqSS{=p{F?cY{i&ead9bSryLvlQ9IZEC9Uo6_W#Hc!`bk-YWn|RIy_s`N zlW8OzQ~E#-qs?}kxw~&=?t-GNyexH98q5$&pqN=wK&IfHXI$54fZ5v^-%i;%TNNV_ zi*)r`;v{DwhH?%R=RtRIYdXXM!~dV)>4Py)JpreKZr4Q%}JR{Ti#G9ZT2P>st%iqC33gveT&H^T3i5($u3!_3cG_?!*zCI zTJv-Hew7s`Ip4JI0$0zKss@RBhxpcy-~Ii!p0jK)^G=vU%d05UI?G|%2lbTi(_z5R zHWog0<~huEc0o3KQ*e0@_(+Z}!T|=mv#g9Idlbz9Y01yo5=Y0Mr(-*Q{D>djPZWYZ z$?)|Hw2&Da8?UOILQmilkXq-t*%TN;!dPP$YDvRTYM;07E7UC-6Ci@d9n+*o4-Au; zSM@+H+m}6NaMCs1Z+!jko8e0t>HA|;TLgLZz~VsdWCW}P%7ySJpc-Nd{4*B2VfHIT3_@BO9f!pEood**(^ah>Kqd#0_+YI8 zZ-$zHiEEskf6po`YlhQAO~257;47N-ia+K3OI>%~0%qdY6O&u0xW>)F<7)tZ z?l*i|^NL3(zEnoy`+{Ri+c*^vivgZ({d5&6T}o=>>PyAl_G^XcoT@?pMtLPuQVCCv z6V8ws7wVwx5BES$)(_Ma99SYP<}kli-F38@ zhsw__98-%kHwZO6eLlfiC)Qvw7iQdHNlZ%qaqntWu-dvWKzU;1i8m0B^h_PIl)l00 zEZnnd$oo0eN1RbyZIKgP=xpo8PDSu-yYLHLllmc?&&@<&kCwdnf{QZn(Fn ztb@hheFQTn$?H>BHP+6p`fm#CHmnL|nMEj-5@-X$koQ8>R~g8|H&USlz9gSy+Vc zOds}lA~cEG-vANk(O4iX0V&%gB=RUjh2SS6e@%k;%FRBWWszFgU60#4rlh$fVn9Zg zX1(4q0A>~;cU$38G?H)di*WE`Gj=hmoIORNG#!_qZ(`L)`Fdv~gR?}Rw3+>=kvpl! z>c;j-ka$ab zV_%b1#y7zZAfXSUygDoo^cQ~e;T#U(e&6rbyeh>e%A=lHipUmM(fBsI`lt)GG(aa@ zH|iNY(O}8GW@H_+Z$4POHQJ;@j3F4(IOXS3oPoo+Ywij|=E+#4meRYgQiYBX_ZFzm!tYRaiEa#D!MX5!NPbfH@h87>CiwY%1L=9A%R2?< zyOpQ!a<&{V3S;55vpWRSU?c}sJ+q>$?asww*>;AK^9t9-t?h0-)XgBsK6*n4N$Z!f zqJQW(x|+wkTuR6Bg%m!Kq1$e)#IaYIe{Zs08x=O_b8$7K>UovLU^h=rYgST5OZ(Bq zDY5^3DY~nt7r526uJkjRq1~j8YkA((+=fqg>xWJcni6MYK-jOM8G0+#4exd5qS58^ ziE_n-t%Etv{fO-OzHp5nR%vdSPP2j&@6HtJ?SsZ>Q_|Pp&+W^-Sd)r3*bn0&D)my9 z*f+|mu6!M!n)Q~oq-V9(Wr_kqI|!uv$j$HV%Oc}BmVK9JruvRR@1^zj!BYPz195v1 z2E+s1U4?LgDTC!*jDIh}A~Kj4p;LAjP96++Tz19lfS1_F#HUu}4A80H%kO~ zzgZnH_Ogw;opSipPbOaUz6N;mQ3KJ z@14MA_OYVj_KM$HMCFkdZPJ4+(rncmF~j@&U4L5)*TUyaB6sIsk7%wB$C!mr%(iJ@ zYlEcW9Ae;!Fx|D42M5IbA*nWW2)7Z%ko?m0pxSw zFoq6{)6Q`}BNi5UQw7-n6R<vTUf1<|2 zXLZm3N&(?T3hFcb@#)c%fOl*?UN-zcI{W`Ev71|26aPbNpj~3>xb9nvx@Ae|GkJS*FCUSC;P2mK%Ni>t#g3=?G?ti z{QJQ%B%EXt`Y|b>f{#YbA_ycu^6UO^xG$NS%wB+gMZF2}6FJO~+WqrMTXAc+bA#|> z;QZGrqr*O>AqeoInfP_|@1K}KFuBt8sY5GE%TB*#KB5y@jM+tq7Cdgv=2(fg&{u@- zVU~u+XDO}d`^3X!C_2ug1%)hTToZo~^L6cH<{(ACd>8s&ZCG+a{Yp0snBWm+lfj+P zAN2G(@?eWnKFXS2XT5W=JeJm`*`o1Z+VZ6;RQo ztTQq{P8ob-o|n)|d2Y`JZ0t>W+eRbjXzjgGQ8_$1h}U>^)-yalythkj1*#`5>H+R_ zzDIuYSSAik-1J6Dfd;4J)Kjx4gP2#GkbSzQT~_`;yC~Ndkoxyvh0Ula`NG}ePB^bA z)ESeA`~DCy4dc}nsX?JKiO_^_rH>G-{>sKYl3u=1)VC^XGXlPz-b(?bHyG18McgX4 z;vi6jt1IWjtP4?__-c@((+QF(#l+z3ECDdxus%p)$pK79g{A`%UovX63&;5;ijJ|| zI^I*8EyjVjMpA~(I?rYo90IDV+rMOIulf9V73aKuon__jg+Fw~Q&{X>@~K5$HIOQl zCvI;ZIPi(uuW1|cF+VO5QZOseTa>XwK%t+YS z_&~5;QGe`RR#|yH^F5~Q*eKs56ro~Gun30V*AF%tX!U@BgNvBFfR2re#C>3KHyFM% zRR7X?3p<}A^h}6y^A!(uKi}t}=zJOAKHzbpA#KE;x`dG z0bTrPKn5vcexX)4K+ASBp9xm$ZzIn??#RB(%s zfP4~?K^NzBOo&UGc&^|!F)>~#sQFcm0ds3*OCI@qA^(2f17^2;x#L+44(F4ihlrg&BfC8u-HtsVdpSChDTgc>D;?d%u*%0k@!d1$@PSy><3AfF{>xZRwEzv~mA*Z8Z(hb^fIWTc7RGE)kf@}g;qeM(O=LKhhQb6a)2qB>JyFqt zgoZ_!yO#!zhvK?&U1+FF-$7oHd*x4Z;*1Zd*M(VqqFt#k#7VkV>Syp?0o9yQx?cTCa6#eDt z|Lt%6vO<>6!JmPI#}B$qvkyRZm(Y9Yg)1Cz-k^|HI$m>^e&i|W@(jV3(t_W6r~k6~ zW>rG7xm&M-a-Bc+I%d5+Aycnpt%SM6z#>SO!86Mn^?a#qR9CK=Qb-*c&roS^$^861 z11P_9r96;wj(rlufsJVcLk#^A#zENHUzA@at8c(EvM2iU-Sz5d+H#8#mm4Gs9U~BF z3)Cycz10&8m`Sgx`@nE(R0xbd;05%-)WHzpnS{(7L8R8{PyT=ibUqzi_X979|Fx`6dtJ5~m$`f!|TQchQDf)~UN}GG_1b*@d zg#j`qki29%FgCSE7mNJ4duBjKh(}3g?U~K9(l7F2_)x$mrJKiLgu|MOgHNDts{}Qi z{0$vezwOxWG6^|XiCuvDhE4ulO*K~AS4!lxK*3v*^#!#adHuzghlb^VT3{~LY*nz^ z(|^1d9z+uIw`9#?b-E5$V1PkGN`9s10W+QWIp>{884#5iw5WcCEF_2_e65bXgoJ{o z9c8Q=sb322sV$^yVD%ykcKV-7{bgtuC%`oM54L9pRzQU*rVgw;GB7Q9gaR8ITU=Sv zfHQjrY8^D7SsVa!yJNFkdmI3P-sNv@P6v3rWut2NF%J3nw;;CPnF0_9l?7)aP)q!X zo&UO3(+1%4QnM7CfJo0DukEVx(1AEnncM~Hi~Z?zY8HS`0)oiuLG1n?UlO1vH~}zB zQRfKcZT@%|@X$1qzARYy$8SMya8VAN?Cf+M%l6om{)rqw zUNixdK*HDJHIJCk+wY`|9=Fb((0C^GR~Z@utFj`a*s&T80`yBcx;eG$oNszj?%nNb z=K@fmi*}I?EYO|pL@e#21zPL?8_CiUR2TpHk*`D0l)q?nY+TStBr<_1ih_co&zYR| zCWmSuAbPt$ezQEio_Qvt{O|+}iBdj{2vbI9(%Gci!JmnhrA}ERgY=om$Ch0gs*<_- zx;(MFo2%l`tvF{;4SPWL;8AQ@)5<-HSDIWPunzr7wswvQIo{@Aa_h^l@3j#2XzlNv zuXHZm&IOgy+PVQv8g>>Y#n+yCL>k=E_5uGbAOTuvs2;Ar?M$oi`1({3+&rx-b>)}@ zG$j_yZfPxS?%Lqgm ze$xsYeuJ3}?N6qGu_lkM{GhMVnSq<~_J<{bye-kUrnF2lU|Qid=j1zw^STM648Br? z&MO2bS+HjwnyXvKF#H=?w0Eq3EI9+JPb9gO%^H(=ZNd<5kkJtttXJ9qCJn0l+_a^9cKKC_b=o}8uZDpsR$ zkx%GNQr|O>h)*ENeW;en)IiVU0*3_e1lk6O@_1c0vw6;&Vso{16fs zjsaSP;@+1DN;&y!qK$ShIUdJjwQ*q`!VvZFmCacj538H5hJs%6WdjFE??|P<4<7x+?Muda)jE?Sgs$`vk z+hES!FhU_L^IJPwhtu+F+sxVHo40!Udiz#}DbL|~t4@cj&CluxSfijAu^*&OCN{&o(3udC`ui09@O1eBD@c= zc=kgQib>Crvj$turJs263s`s}Y$*=#uE%q^!joln`h~GD>zCj?jHRRr9|J0hK1OM^ z_hhb30wXi+lV}#LO~q0i_e!eMJ|KS%S6ga83+{~aAXFZxy}OAuzf0?131C?+;59Em^v*L_tl36|Fo_XDpsl5! z*(K3%;VLR35_JZ-wH04;^Qe@7gX2qFeEdqi4P*SPo7=|k90w?R@3GvJI>-R&Ge2b> z(OTZ>cSV$$Q*EF}UjouND^u8)duwJy=!={MDx?BtOC`o~HEgBqD$`f8`pr(mIe{UI zPadk!cE#cC`%P4s$N?PMfuZ#JEs?2O>yc$`Jx~jGvsTShKmExQq6@-bypIO2RhBhP zrce^Zs^L zJ1LRK%30``B+%WsLw-?K&8Sipyx!T$DG#Vb;peb!7WNB-4qcg~ewS~EWvZ+8_QO$R z9%`q10F$24c8CgxhBFn>@&^?yef12vtW=9c?_DC?W(7S%<7l)6ssn4^zs6(yt8<9F z039FxlYs{2v4(PU0|$HdtS^4!b53Di`3L9^&CO{zfOhX2o}3)47UgQ;ir}!g`TlG^ zTAWEvem}_rpT)At6}(ULpga%QKQX6xcy^kS(`CyQtMj|{`I1rV)KKK9>JXfdA?Hu_ zaQ8}!`mx9;RI5Bn&d8;71wvL39)K362Gk?bB)l3E$T#>@FOgo8t}7QQi}#km%bN$` z6bmtwm6r=DD%NTC#Zvi4<%a+@BwaHmb>x|Zb2xWFH@+KYvxUtS=eM7%=*;31OqF4aGY3mnt=Satn3sn(9wjX)z4}3A$M*bXhu2e!EB?IZJwd8 zAH#m=^GpRz1DT1^I;^ zQ_kWJuwBaN8Ex9@&V7H+%7HJoi)g#Zteag*=I}vGY`x_9L*30lZ1PSuS#)6n>3&?3 zJFva2@hQ8FrJRqCGAn7NGK&ni`?HlJsga%R)M}9+w27${Z=K)-US4b~m#RF5CFDFmoR zPn+FUkdK?2VP}+Aknh7hNX)sx$HQ}YqkT^Y&KAuJeKOSOHW@CV<$-8<72N0~PS?cM zb4nDV$}2cw(j$F#%vUQ%#2u|~yHxLZxrFbqQaNycf40ZQ)J-G0ctN#EkeD%IxyKsf zFJZj$60!B|*RN^39nh z%HuZ#(#JBYo_EZuEAA2&kICZJjH3Ik&;mubd|GiN2|22WdV>EskW5R;i{1Bdbslr0 zo#OUL2**FGJvEPKD+Gg)m!BaRT%i)3!d*VzB|o}15R^@`o%_CE~%+3;hCE5OOi&4@_5@?U-?xP(;~fHh%nR<6q4@{l=9Ny3qOLaE z6oi4Vrx|V7+el=y@)k~@nVZb2&iQh5Z0`8wBxWEzf0%NL5IbE2sE#L>8(IEj^OH}m zubsGUwsHu<`}LXs^7?A$ln^g{l(2s!W>%YJ&Tv8i|K$LbPS3+U3Vmw?cYy%tP@iZm zbV&OS+8+U(Ll7YlAP<$!-E`~HmYya+2buzVYU9=lbuOSO86ew|kCYrjZZlu2{QC7) z+mfm87|Unjtf2chm6erU&CeV%1t17R9Px{+_L(nFr#F#aYliVjYgcL27`eDPnifqO zO(hYy zx0aXhhEO%YA=tliTk-fS<{O8h$4^am$TjZwOLf0NS>*Z;GDi2Dn!81pEw>EB?`aZg z8XCq+cDzVRxLNw9Xlz73E=Mj6gAi;9fe*AIzMhGQd{w>MBYY3uuk>ap_y}50}(lx){(CS~Q{yc#2Dc8g>QY3i=eHTW$85LkzIhKjiZ!MHirDPce zU22k4vq%KtVeQqx1kbyDXDM7v&hCcXF0ry;8c>wsz{_>vXtl@TM&e-z_?OSX7&fYI z{NKaRa9}458F1G5|7lHbYI+`_l#ek9RuER(*eKAFFAW2WNelpR;wma+fNTv94?9M( z%LO)-!(Qabe!cJ&1GFkqJfYZ*NOUGJBb;)S?rVB^2WOX}gW3)#2G&H4ych}Jy5lN_ z4I;^ID7pr<jutm$pxHdK zS3sf;RV*Z#n0{83CARlz?|GZkIEAAsL~vp|Z9U*n|t6@x!ajWc)Lu;MHx#vU%<|?IxkbaMZWk zQ5p6W>$c4w%;ZbGh z+wG1EqBG^l0@&`hZ5kta9nvRmWPO`tU&YWH1jTrGT#s5}zqDNI&EeQ(6=U`C^z8KJ zOQtKiH|@AKSG{j=BmL^g=hrlM{yltjlUd@SM6Wc7B2F^+!KmcgDxfM zOB8G}SmP?W{AEMq)gaMbTlE7);|i=h?c}n&ejX&ShF38On&Bv=KLg2C7SfZHO-wIn zu9erz4YlipMJfb%B=QU|$tx$WQKaZP=a*%`ti#59VK!mLmG?PcGmIvNAFomENJwD4 z@ELf9v;%)?zH;zE#_7ZtMk3n^JhuupsK`&u|I_%aRpFOy9w-EU<-IAyad)z@#75K5 zjBK6PAKth)xXeVN2nV9Ot&++3y|~#F>h9v8-2p?o8h&y1A%zMoeN%Zp`m7Y;K`px4 z0C7!SZP6=`F#Z*cr(8!@iNfA17Z;awsZU<(86`i{z`-E}9l1+3RK3aq1dy<>@Kknh zCE=Ami?xuj-0;jt=*G*T3U6&p+S|CK=87&nLz{BkUfv){5Oq3u0d$l&NK`6(%M6K(8`FcQ-A;d6Lw+rfNZr9uQrj(9#l)b00JE-D za(Ay)KK`)92LGG}lR{6NXR5Noy1oGu6T?Uo99utkI6sUUMI@k!9eQC&(B6eXSEgiiQkjN6^7XL~>BpRZQ zQpClr%Je*evLKT9zRHD3+DLLjZ=Dav_s%xUvyH&+3ayb2)g_OYeDbi_dO#$G57+{L zyrWv%0ibSmjW-n=7`5o^Ezj;+#|6xE-{)%8Z9tY%|ejVN-t9p9g zT^9dSto9q-ZK6gi3M#GEmlc;>jN4;NRT&bCNG1!)G6jJo-%V)_+1Y3UiR>?~mx*L0$K1%-Xubl1Fd zA}8mxF@(5t-t#-mYLy8S(j;D;AK?)ZQlVbWbH1!h3eM$;9$tT-QcB7M(PcZ6Ej+@Q z3=9bJ`YMg8>Pk6ZTI$@~>$lAoF3Bn5JK7Q+E*0e$rL?S6@^W+3xqjK}KF)=D$n=cN ziRwB@5ZkzL2{H#td3m{9Q0G@!X|X!jyx(v1yWh2+PNz?ukn5(;l#Gmta;dUHj{k5> zs;jERs$PMlU#*dlkYLp3h#DEh(bD29n(wO!^yj#C&N?P0RuU2uC01RZ5$as8tE-dp zigGn#!w>4;FZRxxb~~+KHJ=xkadGMs zFBVIvR8>~1drgU)I(bsPLaXOKrdq*L=LQ$68|B|#`PMn>_8nt0%Wu|p?U>aY{eIhVIaTDnV^Ocadr^wa zOzr3x)$`6|2@a5dUNglx>-yev{DN%Wb=EcS>xmGvNgm3|ki}DDyk@=s^hMdSJ5L2@ z^xOdzq5_7NWUX?`L0vgbdw2W# zYPk-Wc<9k5B-k8mbe?bC?AzhHqoSkaA0FJ`wYm!yEf)RpO#k!Wzmr;r_j6u%p5J@l z{bCL_d+w$>@@nMmH(!$i)d4vWDQo#k)hXEZn$jJE-r9KN&^NOEukU)TivAsR<4rfq z%3E$TIw3tbDlI9Nx3<2fIvy{1t}^EDzGtn>o^!p?sp@S59nA2tdi}^ZUw_qQb-W5- zaMpLu%HYf0D(Em&(jpvt3!vU$98@D?FTe`63UUx$anh zSY1y#eYoR&Ik119G41(d-A^BoFcm0p^vEH3Z`<2$t92gE_UJrxpi^Iu>++SWWZHEz z-165m1Ns_f}rIF>c|NDCtOxAsn!SxFk%B{EEVQjnckAHAh zgKq>7KmdVZE)aKmY**5I_I{1Q0-=e*yvOX=-P>+}eFdXXmG@^&fai z2=rB;^pah^K3(qGT?Z9pCUgYGe3x4(jUFBDHFk$cjd`UYe;}AFVAf~ z=TE9&g@&dpqXuLoSS8jLEG?~Va^!5+&dj`Cj!@uPPH*O;#+l{ce=ZvmC`UR4hlq4^0+9=J<&4VtXM=p5q;YTGX$Sg%_WSPHgeo2~|8hu)i zM!Q|US5F>0Q((}Q(FB|>&UMc37G>rwEnaeytiJs&W0ih7JSQhxb!e5Vr}z`qNCA^% zoEnAVu_vFBt*`&ZYv-o7Jg;S0Ufx-^r_xi#r%FU*q;ZT-o%o?kRz<}{U6$zu{{H^* z(1yoFch2dgJLU3K-nDhLqMu%#JY||XFOucyU;Ik`{M@rf8;uP+{m@UF>nFVH8|tO3 zq(myz)5CTZtYfv>BvXx=pgV!@Tyu|Mv;DnyI_>E`Id|@S`Qo$PD$ruGQD#I$q&)L4 z|Ek*ABwu{K%jme&=W@ClK_N*!p{|b^$-96rj;qc&Qk_$eJ@J&-)QA~6>2tieP~AgR za7tuklp5hFQH>OkU>uX40uuCfvEr6nrLMkK^3~`eE$SYlpTgIp4d_u(?ovT5FTJqQ zC}W_0Oi_U>_y6oc(W80jR9IM`I@3$UuCCvh7&YpFx)&pPu=ZY*g1tcOwrhx?zbNJg{GN_FLt;88g-OXOhPr z|G5eT3Xre%?Ny^EM2oJczJJV`J=X~I@T`X~^6<>Fuk-yquBFArhJmwuJz9zms=8Y8 z#l2hy;oY3I!U!&zGjG0p`pL)L7CUF|^~SogvXUN0Zs;}xRv>@?0tgI=z?Hws3`y}6 ziU0x#AbaO_-_=#Mkq zI4#x{MDWI!`JzWe=xx%kQF!)mr(By)O|f-5VuEX%?}}Ne3g`bKg4EVVoqoW2U>OW}Vyn`g`J}$+G@|4Ms^%U<4gNwC&xuy96ER`Yg@LGJ@7T^VR`V zdSnir^zi;$U*F+;UZac*L_CdSC;DJ?rt=aW8WQBBhhTvyU2=)Ta735^*OEs zadz+8X)M>*vc3=N>r#(A;hB7qhi9IBo$v2)-LvO2x1t~a$EQVK_g724xR>jok=(O6 zhV$$>^JMp@JJqpo?^1M9Qi^&_Nu06#$l*g>*0TTs1Q0-A_zL_#DG9K<;wyl^00000 LNkvXXu0mjfloK)$ literal 0 HcmV?d00001 diff --git a/docs/assets/software-templates/template-editor-load-dir.png b/docs/assets/software-templates/template-editor-load-dir.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb22ab47c870d01798f992f725fbe314b8c216b GIT binary patch literal 597409 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%0A~ku6#a8P!&X+ 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�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%0AU*5! zu#1!zW$E${NyV$IwB~7>ompwiy8>GzzR<<4_}3d8yi=R%$&oBF4mKH6GtAmL{7syH z0xMdr>eXYT3BK{KoQI0%1pBm+f!UeF`d~}kDH|9F&v}qYB8QzIV3uUvEol_up!eKe{djHuytSd_i+#PY^BhNb80|dQ6u{&_D5YrW?2V)FRLZ1KZ49MeHk88pAUUnfUd6 zKg`xB!JzfQ=%r@iUHxl)jmW_!W;J|6U71F|b{Q<0+OQk*1XFX)F)R31%ObQK%aUFy zOTGPGQWcVqUtWZ}L|!+kZS=hUFTp8P?;jY*Q)NNhQY}*FpVjjkn{>@vlhkYMgTS`g zrbOgG$d8Th8^`eGh-}U^ni$B%gTgw}1CCH!w{PwJRj>1RXJ|21MG2%&l*7`;va=bF=DN;kA z&bbdA98J9oTa|e?$8_e3j&|^wa`4OHGO^@c$Z#**5Z?IFGo>xY!YW9}xe!FBmu9-4 zo155PDKSsnmUpF11=&U|uZECKg-JnCO&z*Y+CQMD1-=3F z)Tyrd8Vm)Lwf?o%=B>KB#8Ntup^UdT9zt{!l5U79g^6sbmfP>qNcmCawco(SoCCTS3NVQ0NyK#jjkpfBkCuo5#7W@56pyNNeOQRB<=Yz2W_;Z9tO z@-PHO{|F9me5)zwrf7deFXaNArkugQE4gkI4H)XsrHy`0GYjfOk5fTJ73~U)?B1|! zrxBc43hz`+e5o)T;?{uvP0~EhQe@MoidypoOg4>^{db^?bTT{GP?-2^Y<~TrvRmW* zUSm5a>#Lb;03Qxe6`O|FBA$UOsijVz9c=5|JMs=ow54fuUR==TxtCaf zKNXxQ`~C-Wh9;{;ucLRF z)u!8B{fT4a@4R&lJAq+P_kK>9Sh^TluXq;*h$-E4aR!%Gx)I6pjF{SZ_WJHJi-qW6 zRORBE9s+(dM(`IT40+*=FTyh1a=rD3_MBi%Yhitz5)}FZIWF9bn@N*&VsAu-i~bSN zx(UTtoS^XNY&j?WPLq8#vX-lY6ll+DPF>2dnpd@~xG@v|SI2H5P%!wE6XrYHA1cOo zdRy@myeVq^FS^wnUKeGh_CD$Bc$BCnai*fdKi~rXq-4HC-oR{dXKhxuQ()JrAGQ8L z-5&NZOR#?Y1)eqSN|C-kQJ-Yd8}~nHz}tjX1zqYOlk;oZbUF1)V{jj3seNZ z+M3mf!tCSumwuNE60T<{MzY^K@4W-`3{}sm&ZUX`x!%wl_xf0z5>M;VXzDjwwBQ;w zH?RB6^!LcQD#TJUJ-2SxAowHwdxTLz=9iVLr>-CV-OExJ+boj)0+iojGw(B6nOhrP z$V#4_q4vm0?AJK$G-|rrSMKjVR@-~%SDtGXaX|B}pak8m%u=IT)13An3{m+}FE_qV zF2V+65&t|=SN4ULrXX2o49zywz9^{s)gm5b6YS028QUBoua;1Pp`sJEMpT?CFy( z((*f1BG(4%0(uyCP;4|)CrDXMccYWl_Hx`}Ki4>`=BEtSCRw}62v6@7<@UZTQ?@V& zv6%iDoHV6|HjmJdH(S5;N_sH1N~rvcjAg|mcnR*-C50E$B<7lB8$=3yQh6d# zx9=5H@`LhFTCey}O09`xdyW*jqK}@XQ|MAj0oW?;Bo$o@Zel$;4>Jr^&$?ilvD24n;hT6TDzLI7X*>-QZ`W5IZfVSxK~ff zGXvVH{adg=%@|-}8;n5}p7UR>EBX+=E^S0$GO~40mX{a-x)Cc8F9!PmiMUGfm~!u8 zukfXm#W_;#h~udR7#Xsx_Jmc)kz{1M@n=Tuj?%L3{oyYKZon?3cairD{|K%{Dn$N+ zv6~WhJzs5@bO_6VE*n9awf*r23_gr4z4HGfE9U)mWEPY5p{3&QY0q0{Q z->vi)@2O(GD(0w3WQ>W(P^VNrw07ffXPSb7qorFk=5&Ow5ek;MeO>k~yjA}-yJK1Z zEYgEfx@4IM*8m{24&<&~(}`HPvDOSve3~!iEoT^pc*Jo*mq6M|^ts)RNfvAj({~#2 zVXNSUSot!^TL*9LMA$)zIkDTN``9;;+4RPX%Tq7+g384bqUX3<`HKtar8mZ>Q!*xz zU(LVn8d}1PL)ArU9F`JMm-DWE=r|*##HUo09D@J(C7=5lR;K9a-e`|=S}n`|@-rBC zcM+U5YZ0M1?WUZL0x4Y`eKENo#ryTmhLfprai=UxNizcXAzXl=FDGJjZm7K{uI9Na zFY``hm=skhi;n}CI`Dm2HlF*nmgcdaXTKk9xoYb3#_RPE`XeDUkzl!CH!h=OBn)WX zBikMj#qaP70^9&`x0{FT(oU2P_AwB?C9vzfnl$~4^E$V$ZL~0uU?}!!4II1 zFTxW&!LjK2dZX}?)6-hU)8mDf4IV4;y`sbfRnHmn2~5y?6&^}n0}|IiKzK88iuk(yCE%xv4Ez)_+eV*@!$p2Tt&mR(u?$jPh)Yy=Rx_L%yi-NbY}R7pR1xIs8X=r zuolS&Q_%K=ROTNU$;hll{*(BeFu^x&1;6lusDtw-u=lzR!N2P{reDuEjc6Bym=S8z zj(rNQDcvaus!8zSd4=bMg#8*LI`63Fj^Uipb#CTwQNd{T7GC}9N64S5oV2=Arys9! z>HX&SOR9e%<@!@mYiaYCH?%F;X`&mv%iE>a;qld}i4<+=uZ$3T!b7W!e*IQM(kD~G zP$0tEU=ibAss0qoNfs_ zqR6rwru`5yTzPvYv0e>_J&_(u)(a^nN9$+wM~HyI>K?)i?XL_{WGYbFeM5nB-O5%~ zT(TYx)6)x{1TB2@GTy9qhg!B^y*^j{hlpVp6^JI#86eLLaBIp>?rj?P!a~Kib0IjM_XWv&eWP64JTK z;O(&Bo*%%X#{||q3V(>$tR}QpSNE^OM!HicXlZ5Dp5Y>2e5O{uH%SAhX6sEJ zv*Y6C4R#>(1$InC&#LX@#!zFVAzTeDSO`GI;9Rr&^WlmZwS11|8b=^1R1Rn9V?g$G zO|!)%xV2u!A;cSYq!zm+h_+0^AUPLVOl{m6%gpej%pC~uAS>>C$i4CbyeLgg%$k6u z*G#$$b7I`zWm22l5K{Oo#T+qYsKR_jN5eh}!#QZ=6F8W2kU>nqX_d8k%D%4aNJ^u1 z{mc!~(?V8#tSX%Qo*XiE=)uLUnG%KSADP#R>s}kqPX@W-@KQ81IxhbN@+Ca!@9PDd zI!5^Rp-Sa5sJ><~>ad$&B&CS*J!`_(U~cAySwlTIUwV_DQA~<*CI+GH^UL>b-h95* z<18`x_Vz$s|M0*}UxSQ$x)fX0v^wRC;)y`^BXUB|ZA2dK(e&yyL8(@CydGAoYOv_3 z$4D->)>`}6a)HjuP>{1I1Mpa}s!2|lQ?#41^>M42$SKv3mrvoBUiXux02#rzzi*gU zqB)sQd#6p7N$V$_tkB=ty^<>@vt_Z`a%PuU!#N8R#%}ox`_K@Tfz<@Ftf+?%-r+zj z(-CBw?YD~Q0Snq4*}lwn!V$dYKC2z{7oWrhu62Xmqgs)=i)2M44fhNmay5N=wpjg+ z@g;=4GGoSbg6??8$Ch}yMrnVo?WIJom013BJGJcY&-#60z9&K~nF@@($qfOJqdB); za{#x#{#AE;R2XV2i4(Q)dA4scDF+_*Rmu>FPLlK0`DEONy`D-VS zz&uzw7X!N9HKQpXZuEl7%YVWySdpt9OP}_beaBfCM+#{BKwhojHaF(^guo2MR<$54 z=+g<@Myr!saGOsm!exg4vZ!!2aUq^4-a6@u9WFCTARq*&Vf`w{-jp#TQtEu;(k&Sd zi=avq*)Qx{MxH@yfAR1}lsgfm+OGsBo*3G>VC)X49yhv_M8-&NKDR(0a}(~; zSnfQ8+2DR9dJfAc8YRE#AEg`NbsL(~Uqv(-16bX8zkb>265=tFzUcdcMQWx;w-U?C z=&+B`9&6nkt;eW`CPN*$0)-bDiOEI|doUFb>9=6A7mQGVqsdO5(r#@1dM`MAU3*Nb zpY?XiZBr*%y&Tb(EZjrhxuggbQ%(g~I5o7(q8wV^N8Hp(%njsRMc_;jIIX5MfhS$n zH~UBjN^d=*K#9sQ&IjHXJnfJnTw85zP7kx|&^Yo#${g_V4^Rtrv5yg}hkXh2m@s$h zig2EIq!e*ikVX9wOv6{PRF9!@7~h~oFreC;%Et!(z_JAR)3NUw_Y7FlgV}IR!L`2^ zr{{+Hqx2p_gZ>0ZdZw74^a&U2;eaXHyikh=6xJ05*%s{VZsjTc=JAKCb$#$#JCR=1 zKgLC`Ru>mdRk94yR!r0P7p6`ru%1W?6IG^(|G?MbeOmm#!mL*NLz}z9u&{>r2k78s z-%nFA$ux329!0O|n}(Y#i3g|!njk)UVVZigXBW~+Q79;do&5%h(e)8K7J9@bB{J&` zG!?J%dgs`{->lh+RLXm-HTiUr`CX3@Kldsa|BLqeHxTEzXC`Dl#g`kAb!k(g@YC5h zf99zB)K6yca<1yVuNouwnP$A(kDhPJ5NBQd1I`Jxd-0}AVrj_L9~Tjph9{Bpfl>?P zcGJq+;fmTHBG=LMkK$udf|glB2DnEb-#988q0uRPfGZJZG$H+$UN&6&C<5>xo6C&A z2t6 z^1pdZl-Uv2f$A`aKz`|~rQHVG5%mWrzWDyU{pyUTV0G1AYp#ql-P)%Cz%*TW=2hda zh$x2QAL!GOm$SKf@%qOiZ)yYPgof{|P($r6Hv79(4)t}L^B>xWZ^R%P znS8l;rLsxjs{OJ9GiM&JU+#{N{vO;i3+5bz=u$CcQ$a;pQXSI7cM|hO@Dl4BX6=rA z4{R=xWc5qBNV~6l{Y21k9+Ud4dMqz^3-^E}-CI)SWQ6H2Mw+2o?bFb4dAm(?YR|-lvv&jswdS-MtHDVb;vuVTk0xWt zy8s79dK}-Kf9SRmGF87?`Ok=z>TOGof+1J1VpH>|4e#7MQ8xPEYjB^Z0`V$-FHQdv z;^kHxp#ZO4ctPnv$+^rk()4~*Wd2&48<_F&${X+=DHGZb_Ooowkoz9RlCO@M%$?Vv z&gDB~7dGDohq&jo-97P@>zdz5mZ`|We|--{SFKjF+`NX)kL4bs5&9hu1pJbb3fohd z!!{Re4-aYqFZKG4ZdkBma4#!BKaL$l%s@u`N8e9}XBHm-=}{!de6%eo}JUmQAh za3=g3FWPt}I*bwCHipVmN|K*RXu12CGRyfHYL>{Zj-{smn7xHxJDABRvOsr*SUbcH z%%alrv`(}Uj=nO8lXMH@Mzft_;3`#o7U zXw~xr4+rZDVF+Ke9X#M21)apBp=sTH}Kagb}haxOw z@MrE-D>DK%>V|Oo1Jw)N8(*!2L91I)ba8$K!^xFuw%|2`3Q|`3JOT9~@;3Tt>dWe< zfN2Z)SXy)QE_`Uc#ylR(PK#AeZi>*!g>Zj`q(Xw$=8Ld^6 zQmUNOp}j$!5i&sqqMec2@lVaN)DCoO@LYVcS9M zfsVM(I_}u#vX3LAGw>ljLbPJ5a(X=vJqqbq^!S<24^;egw!Y669Qk@w*4MhG7!s!Z zf#GWu`2qOUwgJGeFznXa24jy?0s(X?s?l`SRPhaGZ3WLL6)^wRnaa27{Ms`<{?aOTJE0m-=N|H#}7qHoG754f;y@$TiHp-Hg}* z!p24`a!LCs=>?>pBrWNBmYN6W(2tlYR}o@Y_%vj+0@cppxBx<;wY(TfbLtiPYeKQ?v)C$&%I*L?FA^#S)T@OGiD=Qwm|c2TGDCk8O_?Iu@q7T(z-|e7nYqIWm#MJ;PTZQuQ!>W zw-REE$5+$RU#R?Uuz|Oi0zPz)?Df9d((Es^+8!0$?$AXAaOjAtpQs_yghUR|yM~xi zz8QeO(fEIm@-Svpe@0r2YlkU^AtXB3leH5vz&ESz2oRc>Cxr4aAxCE-IJ-I zqK!#N2$MJ|e!t~8+MgoExYx7cti$W>{=h4u;cTZqERn_r%S@)=$HS*LJP~cS)$~-( zGllZ91coQ_GL3(*VMvA-V)j<)lK!9JZVqAYX)e-)N#^9!(5Oq-k!M_o&_F$zBh|iq z7t1?0@B>`swwZ>L=eL6%JuT*6Q;GG^>7QRfx%;#cMz7q#6H+ZXom`SGJou>f?4XO1SeaThr&}It3WU03l54> zVf}fKM;l*RSCbOv-b#~YD}Bj#ulBFEvW(}NBstnLsyuhmn>C@&j1~)omOXNS-zwEP|l0`4_FY0!Gb4NnTLBL9WTi1{Q~)D})9eFJ3BXpS&#ihqlm= zZm<1mXBty_qmK$(Bn`JNLWM1$Vr$t8)bbd(l;loD9mbQ2pQapiDvvW$1vXxZS{5p=(3OL>LTYHJfjEtT7sN9Vj zdq_X4bX0EcaUsNRWnaCQ!ED2a2t1FawaNCK zjl_LfLO2YI$N#zWu6C;q0k_HwrGrk6R#+4BJfw=d8J9yO(XwV^U<&hHQ7KU+v_`*7 z3OqLXX>Cg0>LVw}!JS5Yu^OP6XURVi83Ub?y$W)R-=;0jjC98B(jJ)75-2IfbicKd-rzpB52z=Y7xwvOt*Z zzqU{XjTKr8=XT$L_#^|yiG4F@B{x{|%=9>It3p{MJrDg6ELySqXh+CF#S)omy!Ia4 zUkdW-Gvvi;0NJ5s#GVOG(plDG)XfKXGFAq}DMP{ywUK4^$wC3;8%Yk*5pS6#nP366 zYfQ8En$HDVFZ7h41^`uO`(? zFzxX5_OhS7l4PAhKQcpANhAjcxe2DHbHjX$J{RK(4KYs!8ZQ{V61*pQu6JjwyC&d) z#Vf4o<4P!dc44oC_8j2e-y+wX5GnJ<`V^*1>ZH`H_*J_2%B|WEs0n>Fcr|!G@DuVn zI3eiqWoX&1b1~d9Lwb?ROsKdrHoLoze-M&I@AaQ@n;IGQ&GY!RA(!d*3E_Fao>zz& z09m=Eh4tNo;7(r@vA)=~!>%HM?tI#yHID!8Yj?zA+T2?A%YabU7;=s=o`GcT~n$C0;6xnpIgl8XThdisW-@>5HY&KR?-mK~D-6R*NTn10k9e;HgIe*HsE+bt__RBebapenq5%tU|(sG^5v< z{!5s}$EIP0mJg7kipY2ZKV{q(>B&nMACm{{R+b8w`=-e}DsBn9K+RC&vzSZ@T z`O4oTB0&1nl^{8Q9NH;z%C;>nTM4{ixc*_)Ca8*O8|MlYvO$g6R7 zpWIddSe2eDBfVGE@+|ctd6>KiF_43PXOm9-3RTPaV!b30ZpoD^S_%HF9*?^X%L-1> zU^TB9rQ%so?}pC}*MihBJ)eOX9PU#U(bHgx=q^t20bF+fGI&|O@nUHUqMtJoBz7HH z@!a>;>4P(Pgb}{sSjh9d+Q~}BfDIsv=+e8A!{g!FQ3F z1xp`S=LgLPyS)h4h@9$Wa`a9^sXv0PfydP*GFk&FH0uX3KA_W=Tcg{@`j=s0;XY^1reW*V#&{^|Fu)is4FCNd zFCctFty^UzuG=v;(lJ1bmr-SWALG0+)|Yk=#jM_^_aN?i7(<13S6=SXZvJ_u5JD`H zb~|Ij^t}vh#aeqU2bIH56IMFG;s+}fyG|fuZ0EVbX!IaqX_`gA36Ixj-VwNorY?rM zo;;GZCJFCiey>=XyI&q@f?M#lG+|nl_vm`hI3gSAH7*JcN81vck?&E2*s6wBmO2efYztL-2D*6cv-dv7iXpc7gN^5_R z7UkPmkh-<>A*{jQ-M3C$Z9RO|AEk^2TxVccS5&a>~6Zks}}CXH<*} zWz~fVX6E>>Y`95anQ?TF%7UIi3@JNlwfxQ3-w%odg1-8QB!sPiU#$I+ zKH1cmUZtIzYy0VuA7Tw9Y_{f?S%j;!(_1+u_ds&-E$@|97mhQ|nmUF8c{GiCLR|lN zRV&%4f1vQ?tmfn;Lop$D*wYu+r!qNQjug%hZCQY4-C^S+PVztersm`i8=i5v4xFpab zjw;r@;cE2J*4p^Ot)r9X-w0@{MwKkCMLz4gT$}XVW3IXAun4%bJaR3ijhgCb<0k7j zUa!NIVH!vcOEdNYw#}N78+yUelPQ#8S<@2!zN z5mz-EyVymkevcds0<;){&2)p-#B*!{5jo}IfvuG3l*7&Bfmof++O&ANAP};JddjJq_EoY- zgRI9_JiP)6;ghTZ4tQz`>gAzDMqt4eNe;($@k=7EzmrXnA97`dsc zJLO|Q!x7pJ1akvXtt(_o<+FMf<_~$0WB*1c0adfSq*ALzJ6`K@o4@&_-F!JIheWys z#Y?p9c16XNGe{S$8Z6!V%Hc@!U>I?%Z@E6-S$mx)S=&>J0`McrWz{ej@HdVIv7${b zkfYkAcXRQPG-G#cL_p6GZ#xYV=RKV`1(66Ljl-ivA3`YxGKtiH85L(#r@+@6JRAF9 zfxEuZ9!opp=s+q>XB@7e62Cxq;tYF`(bk1fWa!+w1dvkTX(jk4G8jo`n)QUwVsWz} z6R&`5SU?U;o*RUV2BBa*gl|>FPK|u32eI6N>pHa?+B>Gx+0YKt7d}Av-tZkbuK{X< zA%&}+=^F}tVA@M@fWPSvCff;3M;b#f#q-)n;$`=GtfT>ju_Gn1BlQ-)1jQaQzZFGAQQOs+oo`h*`u8zlG`mJsO!WFY%|a*&Q8rRGY{Ee-1sN~LPE)QQe+tinI@md16F zMynVm_b6M&D2SJe>$9G+3;C{m`Ct4|!%@Wi8(gzA=lI;4jc&>`eVKF*B)vci!>2s@COM=A++B3zYB@qX=~B<*4Ig=24+N#8+_)ve_3sy<`wew`!> z|I#F3mSt?h7>{^0$IHxgF&wzSJF6fyb9QI-Vgk4$II=elr~518U?n1Ycc@pGezRow zL;eSHeNIg&^5<6gfqB{IVk(QNVcKWZp{r(Rk898T88bQN1v@ZM1U6H-cI$ETzF*Uk z{`r7g>mY}rH9VVeqTyii-~eK{Y1bXmEPF2Di?A3Uy-rdV6yh`?w3Oj*hjcPDf&pK` z4dgIp^0Zi+Giw&T5bKD?dMQU#Ep&=d05!x#aPPsXzlb%mm=us6j3n;%T(B->>a<8kf$a+ z58iXCXxtVGeqgeui+K5XsWs$}EdbAH&;kFt5p)S{aEWx-@0{GOW+W*<8Q5+4O3hEo zF#dzdj=1>UeM*s2ea$MYX1YXVtUOpqaQHZ&y){Lq5-+F-{ClZ8U^s5#_(xXT6|`#! zHh4jwA>B)vKBm3#+_q^4X~^+;fqM-yP;uI2WhP)nrfGMUG%rmNzFi}ICoe8&Pldok zXZ72Fj5y(JE=E2&zb+j5)9BTo@XyiBf)OOK)pmyo*x2 zKFRIKOEkJyN_+>kRNrT`&Adx7IzwMfCGfpA}>ZV$i z*cl6rhC@1Fr2Wc95={l~y9EA-&Ia}|*ie4qjlF`jNT;>@^F!FHtJ}f3y+JuPy+`*} zVi5VR542UyvPtghf>3|gu|M?_3#baO{Xi(FErJ<{8{5rVHv!~;d~SU#58dXOm0 z%kk2HwP9`%47V6f&v4bY-*ZwmhzAQ~f7(X4R_0L1-xMg@C$H8c6ojXB-du`5pMqS0 zH~OzUe?YC&5>wHDjHS=L!!>INR}b9T5nu|Z1{3on^YLNIp5Ynaw7U9qSvj8*72Kq8 zaXI{$3%bW-**32+%Y?Vbu&}*O`mJKQ$8=m%(2-Ol!q~huJKF1}$9xYf(D|jOEQ9x} z)#ba3hfyYWOsC5&^1QMa|4-~O2?6}mx#$D;XkqZR(-`TIS8Q{xX~Zv~MI>}2p@&x6 zgxou+=Wj0^@1G9g9w^p@M5A_&Ph^*GKj zKibi~w!++K&@vGZFihB{@hBnNdMmY~X`gdRe zbo<5ubKLb8nw#nq5UHs9Ht^?%^y?6y6azx0vX>eVG>;x`;FVjIK2^mnvSCVL_mK%@ z?S>Sh#L}|vL_wu&UvpN|%-0WgOvg>0+fG1>BNS^R7?0v^p0jj25afin-2$P`Aa;Cb_=x|ygs^e0jJTF7^**q9efHBtYu z3|n9GM5OxZru0cxn@=UQDK^lxAtbzlEp3E!;GtX-?KHN$%n5l#mS+X$ECw`s7{h5r zLo#XX;cY3}!|TZ$bt)0q)J@D{s4I+L*V9o!3G{^zXCh7cioC0ZAt_Bm)ou+7yM#%~ zVeSNRj;HXgB{Du1WGBhX1@NV*?xoLt+E26hjLE|868W!&ITh?%+xC!5%3e(^H0s2o zB$_8-kYzw1^3xs?LWX&L6FUUC&wie)lR^%?nAlCdxl*4gLF;Y$>E- zG4u;pXUh59Mf{N0i?zFEv>KQ0KVZ(Sm=S}j)-h*~l^5CI_u2u6cZ7R}#gl)5XwRc0 zK_2t18{HivTdnO3fmqNl5W9o#3zToCht#Y57-|Lc1mfQg;lXY|cpN+CQJla?RdM?b9=IC( zbPa#b!w>uI&d!iIcGid&6zRScBpejZLanK!kfzpE)Qm0#YTHwd*8rEw1&uy3S)(m~ zSo$oqVRd5=xUe8pCbb+sn%2Sd#;=!g=EI@|Mtd;>VV;YuG{fCSTx{?-%#(U#z5?RF zv*y}ZRHJ$u4neeDgIw$$h7dV~+3GXVRcx5JU4{XQ{D-gZmb9DD-H6yoH)H3WZ5!>;iWFKEm!aR0 z)67j@TSQHPQeK2)b@*Yu_LEjjeX6}ircVm5AOa34&&h@pB$|}>z#Bt-GLeGYplApD zrR|kX-W6Ca>N6COqXvB6DXF$N&ww<&79ZO8e)`a4TMgq_RpiK`X9D8E8Po^?Dy2WrSoH&&1zCTt{3di%#Hi+(>yrqTog0 zO6#}T<@uoGM=U4euI6Zyn~@3ern*uWERCEJ(99m^r2(IiDg$iz}?C3qVGl6 z3r_gro?9~vA3C}F@kY`xc2Lo3+{nEA2)th4BA7>V!N{7b><6SVg|i|4(o!Lg%R~4~ z|6Ekm)G#6sGPzrF$<2g(#A3kmU@yFAkbV!`TJ2dSqkGiA_`v8(3(|erAKqj5YbnML zIK!RF@bXn1M1*cr(icQ@_%9QJ3K3ax+fD2;5H7*ED>Hdvy4Brf|5EqI^NnNK9^Zk$ z6}!e-zbbdfnP)L`)DiU(i~&G{)SX|Pq0HK%tr8M=;tonyXfRZ(8X zm^LE*(#u{ZJk`SE+NSBWE-Ef#_-D(#VGl5RX<24_nR1 zPk@ITa7HIz&u<{%cKc)|hxA-#&_)MoFpQqFZ6ecpjsC&pgOW|(NzTC0s_uH-$(1-Y zjcN_;g$(gAYhfV`_Bv_SfY*o&v6~n(rJ;f1nWw8IYGT(ri@(C%<}LK&oN%Av-HabM zfPcs#(LB+%>(Q^yU4koLZA4G=oOkN8B(1NJy_U%0EaV+f336@q1}oO2a?*H+glif| z#h730enW*-1lP|cK05hZKf0^{eI)GlPmQCVrsS#y8-pzjM$`N&jiwQsBAIb01?$H><^id9&wEF1`Ok$G~`(!7TMZ#L(+`2>V15S3>qReuU*O^Ur zt1o(M4!!&ou;jGxgW(TXk5Nd!=`HKzTd?d_?q5Lx;eq6dQDf`-Ip6{WrJ5lClfO9W z@77;RDmZG`6oC}xFKv(0zHMfV?AMKSLSlpOtW#HNz~}Ds$z1+(s#ru*To%I++uVTj zHs-M&he&CBLPd+7j%fF2E@V<69b-dG;gxR>kw-yAm@_f6g7L^?qI6*$BzgF+92vhv z?br2|1pmuJ=n%)NI*=Z%AaEB+BU0Z4;#WYjdPysy3JyN_#`1ODAkH&wfDjk>8wB3cBxIVs@T% zE)CF7E^>4I==Azzd40&c52KL=m~h@gb@*6RC)|@f3CXbF;i!(#45V zEdcPY(7)Mm*U}u&WrV`*J;Omg*-h%`_g)>Cb+Aq={?e!zQ$@>jbN%jTW>F9LFrxDr zZ4VXg67__Dn4*`qmg@@yGoRcgj1QYJO*Wo=pqHbm`!&{1Jv-G+_#?C|K-Vm}dXR@# zHhzL#Z*tV&-yW9MAywuzfsP_62d2%xC-#PzJkG|BLMsFz%p49arB={8hr8-rincR= zlK);(1w8FBR7gaEht;r3c2RGLcpSrwzW2lkIe;SDgL+RdUEP$6EN7}^lfuPgB}l_= z*^JowZ@nSaYtOBLKqiIvcyWI0*ac+I!`8#yRwrop74#zFIi2@kA zv|uR+E8|P!30ZrLhL+Stn`vT2&4?z7!bmd^`g1(Ry!jguDUaGq!q{27>aIR_)IxrA$X~;K(#iu1%?Pad7w)w`rT*DOi&b|3zRj zEKu7x*(8vyp2qsbKNts~#ttL(j09%Hc)}OG0ywuU83Z1`1NSswY(^vI{DoVGRbFBa z|I>r;2%G+lTxsFx@~Qrc%=2&H-N54U`UYpfYp|F?5HvA@t9W(Vny0BZd%!oZnZPj5 zdWhPSHTNU+^qROpKoCWzG5pl`7K7)O^0yW&UEH@?1sxXGo02W}ggLT3pMF(c{q@d# z{Dcc}?Kx^Srcir8I#?6Kung^5JLc23N_d8>zg0KQNEHNY@ynE^lFYr++9-wi8T1lr zwuSw=+)A5gi6}|HK=@DKibv>exvz2}Qj_^k%|a4hx|qFP{FAFc<{JV3GFy1Gh25qa;YUU6bc4E`bURfo$Aqg^el{R@gVs()~Txl7HfZ`TWV{6aOU5}wm2|DZ2MhML2BeT z$YtK=r3a_khj=d|Q`u!hRM^Us;Hpk@7o=18o4m*dklfItTcRvww8uh`IPwWBw-idCYnbwP%_!1UhSaxme8sEI!> zJ4nFs8@OztP-83&%X>YH1Q5|p&HM7eq4{f%(__r9m^fK6i!gf<4WeYWPOy4&yY}a2 z?aMV+DVrIIs4COu>Ioo<@Rw6of8X9&#o2z(6aELg)iZ2nI6!L-_h-X2hb=hc|e;5W98w;MH|d*&Lm9L~HGSN;U2X&_*jiXZTYld_=kFleu6w6mn@& zDO_+5x#;=MWLaDjV$4o(hp#J*&^ueU9k>sGtOa@fl+f4onXZC@5=_Sjt11g6OE^g?-ye(ys3J)hB~m9Ynskz5Hq&=X#OjH@QiU12C_D~x6a3=lv zf~aHaE$yUmnad5U5HsRy2Y-1XYyt`7BkSR@a2N$p}X6s{)6Um-xb`)fO-nLBObi~Pc>v%?_g zxr!*!xw~DWRIXRB^+!5#t&lri1bv?~IYLOPuWco`i@S_PZF|M|OIl3oJJHC~ca_rT zpkd9O`Z7iS*gQ+11d@^@ocB??hb=DIM`U#mDs_zVDK|B6BLoJ<^s$U)z2VIu6?AaMv|KU^GgT@nCWb zk36rr`us}-*sSAuHD{`L0=#x$Hk#$wMXKmo9dpGVJkdIxF|?|ah!}5CeNc9u9ch1F zi=kxhlBZZ-4g{OoB;pxnO0uoU3$;eKt)|7vq(d_}{g{veoi*eiY+#R;?~87|W9(+C z+xPRJti&iQs_7@74t_Iljr&g)z`yk( z^;npHqlwEC^t79q>h}qwi%3>x6*=r>qX_<>jz_i# zPv5!}5t5$Qr%TKCpx9`?4qhzyZ0G?(&J^j1xtHnP2v^C;gU?#CJ&^V7~*8AtC0C4&N!oGw|G-)!5?!rA*XA3q(fw=J}qkqIiGD2B#^d`+4U(Ma8*xaQ?&jkI)8y)KV_6Sy9Ev4V)4LTe*{`fTF z515DQ5fC_$Y_%nvJRm#>ohffBKpazcB&qeoU=!ETRbqd0RGP|G)^}imydm5|=%dC? z0uS#Wrb6Tvt1kP1ixP3gCd8qut5NLWmP-8&Rjnm@R@sIz4P?ptrpur4@P$K!_ael? zO9WbL%~z@=(ipJ};l`J_`rBFa;v3A9qyrHEskC;tE8Ek(G|_qtg!VeJXdV zCn4@BO){q7`{ZVdxq|4I>guU4w{g0pmf=MQmNyKwVMnYg4Hd~PiGxlxo#t$v=K1$3 z^oR5JS42i02JBjI!7u#)R^6i$sLD4WJ9#}UqospP!d<)}+N%%x#`+#|r~>C^y&}rw zGaK#c;|GseV=OE6{KW@7ptk=&p_Y$Bd`fiaWDw|Lo2*i#z?~1!%I0OOu^I83sZxvpCrC}sK{Ea;-U+G{9(nq-C;|G3h{k_i!}TCP z$Wa{E_>>4l?R83yy}%co9}jo`>@f(8Fv)(a*pd>0`)|2B6?R>h3Alz zbaFAA<4mj7fKkATSSl{3hhfH(e-S9sxzkX_59~qPSE8DmI98UFz@JgCt#K&zZsanxtam0 z4GmNj&G6;i^~&|g_+eJYpPoZ5fg_4~%X?fjNUS&!2| zAHiqTw8?Qcn=rudXPr7J`KyIBuu^jE|8JD3a=DtOrlykZ#b5r{F|PJB4<%BayP<2Y z;lzl&*8gW3zwnQho#^;9_uto<|IcB5eSN$f73^ja@V_3l=Jl8|o+(b0f1CZ2m-1on zf2MJ@6Bqz`WbC-*{~7cDK1ILJgVwXHOEm~JlTShaYGMA@iEVb0yszx!wQXaIk#4^7 z9m2@>;QyQ^<_Z4-*zxRYvFmmJdiDSBQ~aM9XB`m>^A~8;-$($GQU2#^5w%U%KQ4uC z3M#BN>1ld<`u*|$9HRANb7nRZpE~}Rnf>=PW97a_GGwGbx&LR#|JP)u-pPF4dzEZuUYgrOPT)i#zteEhk?}Eh}N%v4(_-3LpIjqW4jH%GW18l zuy%vezk;~_=Ujs3Xvbm^)vD#ee>0Zf(zLUf-{^2MM()sC0(jrvf6l^(b}R(ZyU&47 z0%#YO2>qL({jd4_b#lqw*D`$C{f1Q;I(p!)k=JR+lB{B%(cVly& z|L;Ss^X!jph+oQ4iu}j${x1PMeCecLCr4JA9DV!GBc(%o1O4XPXZMJbe>fli5Ay%- z-TtqC3#UC`m^lVald*g;{P#&pNh8?19kBSA9NN2~-S}sJ|Mljdp=o9vy^|%`@WkgS@2f< zJJP}LPemF5(8<4E@6lgLBdC_|V7K2LHOMG+Y;g(VX)A4O20~At4;$i)aP1`Jop6}A z1{j}^u(mDlv(h;YA=+Q?;zx*as3B=D*QoyaKn5Q@P)q=C7^ zb5um$MPPgbF4uNW@j?M=24Bx^$LOk*MZ?;OApoTf)Q}L+Z-GL~uP$(yQ6hM5=%D3q z3=CJ}b42Km1)zR`ulz2k3>EG?O!(Wr}!VA0dFtu;{Uw<^5AI7)|dC#ccj}B7NCzkF~Yq& zbRoQjuY?4=vIK(Rm#{0mS0I`QcUd~Ec6E-#;k}AZn|#i${83OG7F^rYk1ql&UtYrK zZ$maUe+a}TjFy6p`fe<0pFTMP9x`I-miKXcxJ#NT+!62+0-Rxdd9Zs?y`ys346H&A z!_Z|VE&Uf#*bJyTwi9@cqkp!IIVHaUU;P3WpixFRR9OQK1wfk);MTLi@>TI;EaRjv^5)ZLuPIx#ZwLzBy4w)A*X67%Xpvyo+%|XAnAVJI z^*jsM-(TuVGZRXijm)4;Zt$ct4I#m24SfXrnEb5YqM907vF8oq65?!J_`Ih6{+dP?+7Mv_ zw+H0p3S?53MeLaIaK^F7`>b#MqW2er!h0V?MMmc5|CZbB*xzKd+yfgwoQT z)>@nN)U|m!-5DDj`Q(u1I~8xl)cF@IL&UkP6@6%j(;k(O@>DdmmSoEezFJ(a7Y~|P z3n>c6aVKU-H7@E3WHNn{4-9;3jHzpW!N>8Ap{}-8m01jVdUCZ=mzxXVuxLV^p619u z_Kud8o-NMEEv}5$)6;k3Mlc)Kk6<-4zNvp0c`;RZ$to)PHj=cAn0tQwYHvGdbFtxJ z=2I`16t-U>8%>S9bA7?F`R|fSY;papzD4nXJqif(Z->#XfkY1LVJ_RL;0%1G6F5Xn zH6&?W`5_4ncaCPMwz`f^N^RHiC^qSiK0Va_=fJRX02_Hb4xqoU2LIyElm-DbTS$Q8 zm%USkid~X@kXL^#|WCQDlO(=C&8cF_|MJ!=iQ0yx>m3IC1tw=_wBa? z*PmSbY53`aD-%NTplj^zw6z_+Kpu@uLxx% z0Tidc$NKcPblrrVM@W9p^Et0R*5Et;+=u_V=Su%%H(*R$9wYwqNd3%XA%E~d8X;s? zmkG3#CjvCO#J|$%;|`Lt&>3&=gR3d>VGrig2^J(gbK`L}W*2K}7FDJz=%G;Kqx4VS z0!MSfJp>Dx3OBo6`|^sjPKc}-+7G0;+&>3y4{=cixKFp0$9;TwcoBaN$ z4H~!HtiUGkm!Xn=etuS%x;-TgMjA#H#7udiKjw5BWX$*{+qg#9lO9<1tBK~qOF!UD zVDknY(T#({%#QsN!`+tU?py}g2x9-Z8Y|pzK+E*!(*1=e-3_@Gis%dsWB>Ph%dlo` z56&+vY#rqvy9wYZn|(ZVKO1On+SABQ0d-BV@XXt!0qE4H_!1eQnjoANUROi-f9dx3K-3 znMp3lFGx+2yY-*xL~{kDt?!9^zJ7VYI+<-qWHLRyyo4#}XuFvxV^6g4A1?cEc6*KR zxgf#iwD~6^qjZLUHPmn~2m;|2&2UYJ7_|-sqZ|Yvkz0oM8TaKMa-w7J9%WZNakQ~P zif6x9hORRNtSu=*PI)DaotwkQ(SH_x&|-kbQTf)I~U%?No`6t^TjO?W#S#U3Q7KV z;x`Ydx0Kz7Grk$k%ZkkG^xt(1ENA6XCdu9UD0K&pm{?wtxo1!w;hoN9mv{PMP@*_y zE`Y<|+vfxqqHiuErYX>8`-O;x*bkW3b4%^hH>sQFIyw)uYA4J+x{)4Pu?e3E10)}7 zjGDITE$8efY*)Vd7Ejv+U&~F&Y@2>fC7#(Xd$&2n*ULu_Bse*x_U;`B<;CxDd5N|1 zn6|qUce`-x%g3GFoxGl&=j=QjxtEuIltBx|($qT7SXflu-0pUF$*KnepG*l%s_R<6 zXihRRgS#Hv(or$U6&L?{!O8zEI3%RFwl)#`;2u#~NnP)z zm?B_H4FlDUT0aFnO-r*wUT9G7U7#=Y7QVbxIKRLg=VacsZK`uU?6~=>`;^zK|6|6bv#J78s<;Uu{lqTR)(qlXv6&#{s z)Q^o-ohjlDQ@1beVap$p_q^*0oPl~<<)zW>TbO4!7s>w7&9@Y^4-~d9{p4idswp_# z=HY5B-po+S^feoy-*-=J6BQFH%4tbQelHfUN3|ArSn84BE*YqW5ps_}3qg2$FBl$mnjxfBl*>f0qQ|`e;(rd801S zNQje>@K4V4^PFjHen5I-kfvuQE1Y-Unsealsz)R09!j8$C3p?C+bS)Y$wc zk@^#3n~w6_h5JdT@~?gnL*~iT*e&Sg`JG6yCf%-3^cWB(*~yEsL>gHfHdhvXWKVxl zRH#hCwF>#MPA;?36w!U3=~4q@>5xM539D;`9h)z%aj^(p(qWo9jDII^GNJvMRBp|X zvjaC?z^{3gk=tD(RG4vv-v5pby`Y2lPUt=!y(AnK=cT8$a>#ZtHbEA-WPD0)& z$8trjA(cvDTz>hTE#&@S))qM^tuo-wLKBzNy7tZzwQVc(@-+A1j^jx zT&642sq?$JSx2BO1Y*e#;#tUZTy~)$ z+0V6~Sbq}r8BQj7z8A2KgM)GXAFXIRb1pDQ;OnXC@@Jf9`*SjLtW|r}20pv(Bw~V& z%b)tz-+v&@5b?D5h?T4Qc+|!qrgJTQw!DQ?dKLDzm;}j!{8AqK<|h4R92Em{_Q@ zXQn{T&;06nLGn`)dvagY<0K`?tcl8UO-yJ>5id*&a#maaqPFn)(ssT|(&;B3Ihe%5 zT+AaK$|q8|HPHkh{ZS(;f)?0MSp+qn(`JW=n;i;J^y=Nmle{N~l~$#3OSuJ#;( zz3e4PHTmz7IkM46AWqzMx#M_Tqn6j?j0E^)H{j`vDTx&3cykn)%t~yj0xlqvLOYFt zJnzyylwC!;*Q;4*X+ggpVUnZ{8t*=@@;V$pZANPC&z)}2c@d23JGLnbc^wXYlp}t(k0|`$#oXyR9&~t@H}J4Myo-uI}y0#YvtL_FsR- z=N#`>-iF$wyAdF@5GMotG2Ct6qI368(H?(%_vHgM5iL%m;lRSrw2uk8A#%b>vsZ?{ zzJ}p~{~{IrTWfpoalH;G!T3Dp;yKWX!NQfa)cU%2#0F57Cn?E6m<8>G2 z%9Hcs-As-=14^V8*=XB+Gz*D&}^K6^zSspMfb zx^~)iAsGYsWm#q0B;15!hSA|?LJ|g|G`l>C@4kkMp2(2N`in2nL<*1riifBW2Z`o~>rVaLtm?>Y3~QSfNKj|bt|;o(yXnDWNW z$^k%XcSfxA{G2xqyFLt=q+I1R>~YxR;(Q-%a)y%iFiG}Uy-$fIo{^D0FT2h8g&NM| z451GHtw-JBQ`I2+>Q$75xmks+*Q-5rJDK$v2@kF4VN}Y*Ou0%l*GOe50^L|`i4lPa z2@0HuWeg^B&(%m|$c?-SdNaAWI0PBLzz&?zwy3=}ux0c=ao+shO?oKd_IYXN-JFOp zKYz3=KSP&8pMJfg_DCZ*psC&{&4Sn>N3Qzl42H|nB-Gc`l+*UUlo%3<0rS@qo(+fPOw_h@)%qdo z+scId^luK#ZEJU3Rtdj0NV&1wwM$CJU{-L#1=gV!0dnwxV6P_RR`(6n^<@qZiN9rL zeu!Vhoq;bUv8UfHi&Bvim@gRZefvh5^~Ysp#RbooX|w}O*g@QNc5?$GBg7|HzQ}p) z`p1JJl2=`x7XcMRQZDvU-l}1X$d$#n^kON4{%Nnc5)mgf5L~jdM?HYKDg9b}qiG$q+%Ozhdl1(?xO#=OiVUFOxub(=f6|I-3c) zE!U(+IFNpsokG@Ihqb)DQOHL;0nL=3 zya+=xT=ZzhMRAM}MCV$>-w7_f@x&+EXLk?n1fE`ymx^c_AY7}WW@vZ}->XPod}(5pettkdv&|7?VtXsZ$9S;s{7ypl>odk$}G!sq5iQTua?J%l^_`j z(J^TCw-(33AG=n5kPela;`ba=fwlf1JkZlGIPA<;{2D0LL2J#eMdBbiIAsPvXgfI47ZYOp^_vx7 zaR>|phQu1yQCV;+k`w|w3%)uvy1wD`cgq>FQvLsC%f*$@55O zav0Yu>G1g$esI1<>34IgcmN3c7R9nJbn)QA2@<>6HS6>qw1&yQl&TuQF;jtVAp4U`)y^+-8G*+#DZh$*UP`L{>D*F+Dh_bxW z!q4~3U&sWY_j|41Flr6OWXW~T^;)b#(WI+aZE zH>|!uZ8KOQ_HZ~&;+yY&IvT=@_D_StSWnJ9q4+W;>rDe#4o4s_$%O;c(MOo7iAlEj z%uvAwhgK1o;L*AL^P^k${;ja!nF<{NYBaz7>R`tq#Ix{_w=?Y$$&>(m)c8x`CH0@^ z>z|n3A2@2z%O}5A?7*oJi*xumS0gk-X~W0Noz(@4>MnRdwhf0 z+#JDHQx!Y#gzQfM%h>q3H|OtwJ>&RnD}W7+X8m|FoU^0*qWJ0h+QxZrMLj9aLd0}_ zj0}y<7Ci}=W!gfnlB3Bq*-6uh7B_A%X&!A|8HCmAGlP3Zg7RYouiKSn-L9okAyW@` z1gcM{)NntX)3&jOeZQk=f%q!S(x62|dX?~CTLqlXUN}QWHHU9JN_Y_pY*ATfw`QV$ zzbQ%yzk|R;PO|_)(Q_BI8h!ZiYpSyY>6^q9hd2iuKJR&(xVD@nL?43K(T(RkKXVrT zrVZt;q9}W}qN0+luAU|*p7dx2mnvfC^ng$9C#ypX<;8BFJ&#_pn={quu!JRhSK=$% znX+A&-M0PVPnw?5 z*2TrU-z1dpabeC?>BgI$MPX_pOj%@Kw|VU8)gpIr5$Af+gwaSBpwH7>10rWajU1JWpM8!P&$HGKC66J>;{T zcz>nPhrOKA#>yeSdR|?6Q@6G~Z4QZA_}=h0})q3yoC zx*lnV?;)?B3DikM)(^4nJ5KEf5k8ZI)vExEFdav?qH`tRCqw0L*4U0E@d z8&s;b62Cz&RKuD7c$w;`gXBAqWqt3KD||#9a|0_+oe)vo+SM)-D~EBxfh8;{t_lka z^cT0Ga1VNTZ;$`6r-%rM<8Nl+%PYLvKNe)?vnpW|9?Rwd%gvlc2Dw#dHnuK;Nk4L z)H_c89OMPKpKUv`6Pq#%w{|zTW&CRK&B2JY_aAWTGI8{zpOD&KtmiTyk$j)*Po;Xe& z%prPWXKkyQGy~+%l;=lDPb>~m7wm~F*DtZ&P%$hkESTo*w#NKE4j>_V)I)NrtgDAeW7cD|cdoGBHuIlj)NnyU-&4N?z*qA?aU^WocIz>E{#_gdKUk>3*FpQZ(3+ zJ~WpkM}QVxy<0x4!sIfuFX#VIdmqGWh!iic-($It4WA`03AR| zLMD{yTXQTpFL)eWqI4Co_xpn4ubQx;u@_XvY1H*0LN#bZ$B5vB>|YkJzoK0GO0Sm} z#2_-R03n~4!v@L9<#yZsosmpX1c%&to9ztu)Pt_15lT6K{CD6`8Xw8vdpc(ccy$tQ zGs6-h!)&VbI<)t=@bky_MLcqZ7itwy8t1Q36^8Bg^btA>oLv$vxr66%V%?&a2e$#f z7WVg80bNrw1Nv++8O?mUvRH1E$ahN?RAh-t+U*(BPCw0h0AT6lyzGTw@S)*@B!22Q zQRIn2N(}+ovz1+arP{)l#h#PiA!rTKZQ@++dhdWa8~Es zlI|+g1DG@*Ggt1O=DodJwOoq#T650ZZ_lW}X+i1Abe<+}@n1<7?%3$)90oCuBmLl5 zye{^%ANwlh;P^N<>-FHLz|t9r2#f54%C#T5d@q=of~9rSAOGC5nc)zgJ+dHpm{1>g zA)U}3?VUG(w}uoK$fX!)TI*gKPbNpqtgYSu_O7)soG8+?zEs-4Q-Hu*&ilJ{wYj-D zKkV5|+Rdg^gcq;aHp~-7`f{T->~;Z5!2$02buPyTUu0Kq%EEMu610kyMNpiA@REd*a z*G(;@XB`*nVyL+cb5bc(53@svh^F$YM=!HPADU&aNFJNCUI$P}YHMlGo<3*VpPr^Z zIukOCU~$cq_4H)5hXurKOK_X#F*YLC)>ai4SC_at&I7)&!7Z2V#zQzi6+0FcMmP;# zijIkNRVzrv(C{nLi@J@~0Q|+MHmJnITrx>MS&yVQ?uI#HmXZ>`n`eOespa8KQqd_XhOGj1NXfg`;hait83oN#QDF!7zfyfZ@{&@!)kcb@U_c@41pmnEviPNjf2WChvtVJYuL2lUw8Tf$o0YU+MXO{WeuGUL={hxgz_Z9MoqZi+Jmt za~4;bdafpxB$~?6e4Bkw=I9S$X25o1cknmuAI$qXC4sMVqo9z@G2Cg?J#U_2-|OS3 z|Lq^(`*NOKk+~5+gXAEFq@f5D*CzM3)rK;;&>J%zWkXK&mUng%o%}^XGgyD|qS{U- zw<-GBcZm6-s&<_(59w?u)Nh^pj1TBigglZye=?FkkS8V2(Be@Pp=N5KM$Yp@C+RUn z60jtpfwwhXa2iW_=f~E^-aL+-XJk|1k)AOU!}y>$MQ3C$Z(zKpX|2LQTHi z=dJUva(5i!>pYQb&kcrBuFg8<(2OnPcv~AfsS)drGu@`09k8 zpwygx_;haCRNgdtmrCc|N>LFTs#43Xf_Vm#m*;2_qdMNyq?fy{s_6Qx&(3B)&9kF} zlZ5;vRXEfN?yeA?pdpN3{ID^KgW|;o0mM<>cZ+Js8_&!M>y>FG2mGg}sCto$D4S(_=ricOc`R8?xUytuu z_SWfnGTL(G`yuVd(#kSU>LnVMy}Sw zT+1oTZOtog{#8!?AHP%R38Qfx5~QR4Igv9lvIr(&n#%m=8uifkUm+WcBEBa1T90$w zV+j8sQ(pZM)y}$T_OvVIvEsi;(nx+P`TJD}ckq^O3y<@3m;KUU0zu&UQMZ(*99VGmvX+gm1NaE@#J%TuEcIo`BZs z(%o%Aji6R$b`omNtTO%jVkWM|p6|azG;}rPhB=>4%N8ptDstKx!Hd4X96h!?gv#pc zr*&4=AdawI_vSx$xEmP(ZDD(Rn`>5%LcpFI?lUKNtl4dQLe4fV)*~tk#9&_95*8Ll zFc_^7L`nqbbfn$d-`8>&JEA7=_o}{ul_8U`qlyBpoo);!7gc7*&x@gj9p+nfBZE=y zwf@#Jl9a30_oKete9j0wd1~K)CB0(?$7GyIy@p;*l^4~PO_>~zNFI~YF`5-rkG90c znZHpjY){W)lupJMcWSLg7#JAH5<#!@jE3EysQ}Cp*QKskdFxG+-;KR4P&DRj`2Jfs zbI0C~A9L)8t$60kTcpRxcNjE$Bt3iKBJzVOhibm&abncUEh79IIpM$gDlg=Abo#vYUET<<)~qb!yFMQF z$rd>%K(oiaVrGi+LHYR*9e;(bk9baM98CU21P>r@qQ_!u{rod?{fi5yrjmbc>ia)B zWu+l7a#W!%D=bQA(;9z|LuL$4nmh?6C8k}BGkg=UTyQO9uG;|Aw0V_d$Td2*7gM73 z^|bSP>kE!KCIgii;+m)lxju&nfL(Oi6vBk$FhM(J@Zl5#+g^drS2AX^!=D^Pccxgm z7n3K}f~}ToKI-*Jdyq{B@tClBIL85x`+hRbW_uX@nq>V%aw-Icv~lXtj5o>J|LOzG zWXA&Y284tJs;`|gqar_PZ><-<;CJnLPf25`%lR^`JG{2Gwgy=}ioTa!S1|gkZfOZ~pAda8p4%KAQPrL8msNRdYb3wFTY5jNN7BUWb)X2J z^Q;g^v~5~1Lf^&EFwQHOF1iv8Xejr>4sXk)&ai{R zAOC?ak!oaoF7E_x6506$UdM~H2n52*M49p?N;D?T{Y6WRG&MVa6~@cSiI+!b%XwSE zVG^cL(7$lq#|Q7NlEykJK@E4WzN)b_&bs-mRI6O8!&UdUi#Vo1*EMV#C0@An8+IfA zecIdObFRm!P7C1r2#|?cax5+> zX<`&~9`h75d#qdI6>0OFo141B-7+Xg@;_+kf3&UtYsiV_yH4#sBusZA`xtVYX-{sG zDT2Pl3NWg$WAkAb?Y8@elip9WC&tg&h3;pky?n{xINhczrT|VM{K|~&Ul?2s#hwbW zgyp!49B+|>OcAdiNHg4C47q{ESJx9&J$Y?UDqzIFYU!ZU^-WiiIvF*zY;P-12H>_A zw6AIzS#8=?D6-e{4&@uLS=cr<6u{18mY&3wXK2TsPi&@Q;M`VkHFjgUeQ}C+s9BcDQ!9tx;Z;L?>gD)UOT$D z^2ZO(T1;HrK+u5!0fapzS{6W-;vco<^6jN>;r1* z)Trt1d=X*ct`)D6(o&5!j{Ob2fPGmzcIWL?IZ=<@qWRJF?&t54xzsTs*wK$*?_VAa zOD9cAf6$Q+SOD*-OWEt3`^B<5z5>wvICg-x);8(6WAPXaT*V0fVyv}jzI}B3#=rbP zbPVs3$8hUxgqZ142#;AFkAk7E%`F+FB!AOAi=H2+pSpjc{LsY2q$DC@mPK}wd-Zhu zcKB#ZY@!62HjEDK>V7bl#q-t$_xxm8syEJ(E^0bo+AH)J7Q?{cPjXVzeNQl?o#6kU zbOL{dKL4%rnKxTyNkV00xqpT#Sb_Ovi*KgH+nawdL1vkscH9E@a~I+|ex&O*pQ4<_ z4~Zi{_0&|Ty?F=dUbre@=?3FCNG;BQnqu~V^3)5V-0ZAFdo(@zQ{89$Em4vBvr!I7HrplC*7OZ5|3t2&VTaWEL46c!11=&x@Rrn&XRipTz)YdZ7lZ~9*T+PGzM}wDU zM%uB3h4~!eHo4+lWmQ#bdr=%fN)jKyL$H5SGCK#mMuO*ZW8|k#rr}eU#+ly!om^!} zzRDAR{@4@U0t}wQ1~~@G_AG}-s`e3{6J8_aG%nReTN^ALJADdpe1Q9PA}sa=#<{bF z)WTHo-Aw4Ei_yi!L!lsZ^2~ZHP`W_5J>iRAw0cOT>f;`eN~T*9=yc z87Z<`!yPR*%aa{B&mj0aXUJN7=EFu?up>N(AEf0!DA{{g)01C2;gwH}av+Tf8Arq2=Xw{}4!UvgUqcJhXZ7g03^B5P{O+??%M?2p0u`Tw>} ze71TTWKba^V@Gq>ihEMSde`_cg#1OOxVN;x3nndQg6ar2b=@!fY^3z(O6DNYRYy07 zflAXmHa&*uhq%&B*`G~bhhGC)7115tNkVt}{4??JPr-WtGB|Wr*z{$CxP1LmU3)?7 zc>9V>__q}8Bf-Uh@J>sfXt`1uVsAm1AL1TmWo1kI?<)-B6Gji_dNOT^W4&gy9F_B- z|Ee|@%nEO1kUU!yvDtFpGi>v_$x~7Z;AMt42H%{GUF}NxWV-I; ziE27$8C4i(uUPW{mW5b1)^!FJXdaAX@Jg5F5ni;N>>BNKk`A3u<^iZ_!iO?sm<*H2 zUp7a~%X64rr7kyrRDcx%1Eu<X0Viq0It@|-C_a>P= z(DW9tm?QtDq4nmsJD;7}=A>`+Cx2}5 zqZXa(STEyVRq%gZ11Su`BR~Y?PMLv%<@2NU^OZ^EsAt=HnMu#}UsxJxf#dvLuLlHN zJ$O9F+Be;-hDM{+{c^e))b+^a2dcg@9rrA<6;_mdmK&AWo!xsw_Tz(E&R$E-+YKe| zrfq@m@h2Jj1!_cMjuNv)$w<22R?p+@0tFskrpSPT8h`68KiGF)W z&eu{1z;2z#=@Et3gJN5}b|*IG3|T#@14ZY8Lj*VtQ&bEQ#0daee7q)V)KYP1f` zwN@Vk7Z$CeNKyH?Lp6xNsHWJPw&jyJGK;Yp?y}&(D|ef&`UP(9d@qZS5k~*=!AR4T5p;Sv{ximJEfik1{@Sh zC2O>Kjnp1`S{8 z7Hc&lH)H5wW%nA}KX5hEf=BwZKZB@WsIC_%r=@gSYE`=Upzk)pmwl%cx~Z^RmAN60 z+|4yvs2)7{sHAkK3{aoMFr~jWk3vi?nR|!n&zZNjwjyK5R=>9Rb>Cqzz8aB%Wz!h> z1(o4$dLmKJboEW{=Bl5e zn!$Ty>ls9A$-ds!q4D!lqV3iL*zr;8=EjDir~T50$Vh6U6J~i*{qkfFN+E~EtYUR_ zHg4`rL5G%vSO#p^&JGvpFw@;u$KDSkpz5feTA$N}ogJI6r!zkq<+$j*E+df>&Bzwz zDN)w5Cx(}m9#|iItVg!g<<;4#vamQe4@aTDAJl%nW$viOeoh(*J;d zIst)AYrOZpDx9Jnq$arB7+m!|JPjebdj z*n94_fDHq-<=TXzG{5@QOPplLPok1SLx{LY%4?3Q7$SXTHsinZS-zkE;z3T5O`amS z93(yz>pC$tRko?A8~BVQdqDSNW-pVkcWIdH(PXhrP?Wz!;v9yNVh>j9PRB#d2Xi0# zGZ%nx?^&lv2?UaJE3?_h;q>5o33;lBEp-{7c?2CzkKIf&;n5m91O0xDvc?;a%Y*2g~hRqv=+kV0;RcI5ovV2#X~nD=rJ!V?}fx+p#@$)^UAuMaXN-o}$k%=OhwaOR}x<&~X!P!!OqU(-6 zf9+#~xtsRmg{asbw1p$X;Rttfh-6%^e!Vo?igkMvLJ5(-rN3xSqLXI?v)K(Ub39&4 zFn`d`sWtrRY<-d!Wo@Cj8;bM>IN*B3GpT`qx>U>AQn$Sm1LTOD_#IyfoTfxX<8 znPQk#_Jo+EyY(tDq$fx8VJA>R1g7EEY_3Yb)cA9nN;hbUCrEWWq>Z7aK3W#?6O;y+iE8*5@&_w z<3oI6JZRZ%Df^Rab)So~ipp~_ zoY7l0Qn{49bdpvUZ?VxWCWJ23!^+Bck}yVohaxP`S*i|%leB&qbnkZ$dRErHWy?SIf8PjqSZZ4;IEQ1-#)EDU{jkO}o8&>zZ*hLS zi^%RM?yHRsy?;V?RD6q$qJf`EdY_;hW4&O97_t>3xHo%oEz-#aAAK~Z43>lW@$d@? zsLPs#QgYaC$TjTmJMYa4Y`Gf@dk%Owx;(B&#-QN|N*S@;sE9mHKl&X)_7w^Y)O-JwB*4a|#QQ2nl_VsuLLBNVHD_8@ z2%{*x+GrhF@b-pJc?L-Wi!jOD01XlwGty+=538J@IimY%UKHvEek~^BV*9gJ30K>N zzKY8h#t*8#u<>z#+HmXKC6?_TV!+;h&omEZ^OfM|R`un`9bZ#eoBy|@qz{>ync_l@ znvDKn6&yalY5i@hZ9Ha1fbBo?EEe^Ix$@X=z~67qJ7ogRUj}mO_@Jh=w?E5H2IZxf@8nSP9|)hQ_I3D}ME*|}@)yB6#gFibf#)yV{b)AI9CxACB3kO(fq@I; zW1Bj@CQVm5(DHlq|3F&b63RL)_Q&psX+8Ux1*W-q?xU)gPUG&JdiyIFdm@_OLrAN+ zm#hU_RBVQ}ya86SC=*ZTOGG+QM=|u39S==1lVsNmtMMM`BR-)=TeJC+Gxl7g zRQk@`xF~P)=R~D9ZxXZwJ`w0)T2DOv41eljiVOU_sZ82+F1h=~uBR_S6Mi%vo{X=P zyN7pvLL_pXEG?+9Mcu@%ykT0dk09(W!`=7L!~OPpLE?wvQf|SHoRW&hXDAn2|4Ou4 z9373zD7;_B$_|0AzW4t<$dh<&Db=KcIkp~(+2d3C-QqIE&Qd|GTJHC(>*>Yig~5P1 zjWI@eWMpk=3E+m=tLGTc7k3ZWB)TM`gb#~btW|oW-r8+=kxUb#`ukdNdm zEC8WQ>0HZM5fN92OSZ&seQvMKQ2yrjy&La%!!2lxV2zMYBjD5~e{^W%R1 z%&c-i&I1vE#Cn!Fc2tz}94Br@2OJ)TJcFaq*?dqRIgw)J0#vg;Agc3T57UA^!3`XbxjO+a+}s)0M}ij;77T`%U9cG64q7ZH43 z<+Fqq5xLA4e{nzhFMZ=bfBsx&<~2WD?f!txS4gK^dT}xW+~5Zr-$_%l-H5$e5=B26aW7AlT8le zqt}%1+(*r?0lYfV2WN_1+d$ceSgh@e$X6(crt2CFao)3Vtv!(y_uhf7ilt(V>lPbx2=b-=5ut-$n-f{6qKn z%kc-l85L^XYc+;Rcgi?ZJsvQPM6ZZ4JuX`l&F4JY-+6@f?HH#G{|d)PB;Czn3uB0* zo4eWiqs4AkJba?uf3B}jAqoVtB-&u7zDWAsq_QwmEk!-EuH(T$9bcQS;tyzTs$Rj0yzeVR0!F-cpg5hz0ub|=@nW8w0)6+4_GVVnCUq^Z3?!1X<)O+` z$A*X)kg3qc$CA}U?IY=j6kpRm6Y(6NtD)!bY6G|N>Prpgvs4NdL;dzqU1Y<#PQZ<~ zRL5+LN8-XsXJM?c*?3je2i@S)SdR@#*z~+$p6%07-`k^nug<)WvEx5UPmZ3Ge)sHI zqnFG}kT>}gW(jgue2sZ1w@m-sF-9?BpHGrDnU%jMgnI>MGQiaHLY58Ye=J3@V5i-!tZwCceGwf8aKM(DKhM@`JOpLg>W;)YPQs0eY*GERo}C>qPv@ z2QPt>?zP|u1P*BCRxtQT>NVsu-cNtd0{{!0WD0XePi_0@{~ z?d^Vt3x+U;GMz@X$mwqD%cFcynE4m0r{v_cvaD6rQ~EET==B2r;zaV_W}kmVQ2+B` z0tg>intotDLw>eC6 zjQt4k$CB%V4Z7nPuof;Eyd%{A$8jqC2`})<&u6!?_Xk&BW!LtvLi;+NmV;o?$6Hbp z)5e3Olhj9l+y850VZ1cJNLou##7v6tnQ@;BN1$&9zD@XJ^v3e9)2D|Qr}K-F3Pq|H zG<%=^1uOpf?CEa=;vI;ZON}vCUDETEli_@aBbPJpzc=LPm;Z;duYjs*TiZsuyF(BZ zP*S=>Lg|#=fCAD;BV9^|h;(z25KtzA+e#&06fWX1w{l zF_8tXj)pS>M?xQ&IZvGoKBdf>t#jhX&k8nybcxnjiQ}98b^$Xa^kv^|Iyg9}Dk`S- zRVGt(Dl03GG*(eCA+I6*oW8y-F7dO9VkPf45E}38XL$5Q<{52ORshN%UoRf`6%=X4 zMy@EWJAX>)@oYF-E(28Np`xPFDkvxbqcsiW8~20dUl-IGM(p zGV_w^;Z?a2cbq3ehdt~Wwl0&ClU!HN=CNN+QQd|Fn&Igdz{;jzah5^-#Q4Wz1`qy! zVSMj2-1klXK_;{Gt;n+9-x295YHw?7Flv;FWCbeD3f=d-xxTu;OgB8Qz0Lba>d3Fz z{`sN#3ONL74G~{=F?L|TPi;Z8?*e)yXhxt!d3g`G76!7!i}4rkd;umXtf%=|L;5aPpMVIa)*8JTtz|9h#(v5)e*JseCdmp z_Z#ThkdMD@*#L7#9gi5V-9bI2RowLTcroN-Qj(=0g^iBqN}TbtAqdW^mvZVAp!ed^4_$MJ$!m4ED@@*tyZdt-|@)M^0fZ#@0aL4hI5zJcX_J*T=#Kb@Rx zHHSqWWk(oe@A~uz@GnEo@i$Bn_+4th>eo&++ZZ{zPR0zgM|+tMRkCw8rW|=JL**z^ z%GL=Rep68fga_-!mt$a9<(HID;?I4KCQ~(7%zTeb#rZfBU9)x5cB_z8d1|1V!IFPE zyTbd{ukqd&X*R+9Xwxmg6I-juU?3cB)~Kc#dZd4=5v!e5U; z+)9p)=ck{91n=|ZB|WnPvjkmlW@#)wDrPuMQ>x;@!HG&Gly5q>C@-1RygRoz-3!zK zDNR&Y4XCB*0blAOR0-ak7Orj+dJ8(+eP+74GYM4 zTY)h4De4{3+QuZ@M^9VI%1RE6;WD_Nu|A30&I3ck!&3G}gM)*Zb^9kLv}f>0NGfh_ z^_3PzMn92L4-cWr>T2!3z9R~AIQC3YB4IJE8K00td(M-)r(6Tb#rI}i8^fjC-KN5qDk&>ibf&BKjnp3Gz8fJYMbR+RDj%62CNI8e9y9O@1a zGq$J4{Y_?*k;88Hj_i)H_~sYs1W%)4iT~X6e_Ux+M6Q{#bf-^0P7A>^y8SY6!8arsn4f9#Roe{Xi!Dqw}M}Le$4LElJuXyA$U%pcX#l5fCn&5D=jt& ziBxwCOU~Nb8jhe+Tpa+ho`Liz`=d1_0M7pUzXx8<=HGR-6XQ0KZ#AV~2~l>i7o>GV z3tIDuh7leRphSH4xpiECK14kF)6Z3JHl#@n>{+fqzUZ?ZsLq;qs)CFl{Zbdd`w&|L z-@4FEaAy$8K%b6*9V-AoL}Zm($?v&koAdH1yaZL#m48zv-0SO)2MXIxs`$>g3Pt}J z6%$jaT8XY8)Q$*kX&1W5%xAxb4cfeXwbps|)9Pjid(qQDMFDStBKv}SH=#;OjQ@i= zX-(w7WwSS&7{9lTstXUSBaX@wMcy!GHou=njxW`~kWj!AdbSPtH#kDQ$smDNeRx3r zL1hs$iEm0c9VnhIsFJSjtqQY>so0dIIkzjyHO~k-=Q55Ln^mI5rofZgM+x+6ND_AP z0|F2I@cr++1uz4=xPP*qEUH*d5MUVYc) zOQsfTds)Sm+!j*i(<}nNQdk=v{o2_!^(9Tb=h33^`poC*rxjQnn4p(R8FEjuU_vyb zCR;XLR8o>0Fry9l5bbYoc>pm>Dm;!#L*WW*uu>z0o5S3qKrm$1(Yie`|J3!sUkPfvP!r$N@cM6+HJq?47I|PRW zWmi-jy%6gZbczPrzz;GH8c`V<4z|f@qx+wFvgp0Fo_&vw`+K{kxe|VhVw~=S$!ulj z04V_M7?5jxO(1<@czt5^J3$3OTq644@vM>da}>wk9%7d$T)JW!Bg6LLHrFpRijJgM zz$b#TXpI>N`8XZ0vFdm^UqBsi70XX)8G;1M{;D@yGtMqbW7eWRionSJ(FN=1=vXX) zC?7KVGpffAJWM*xIHn!BQ2e5CU|!{$*Wmps_II2 zbbH@meqfa0EJG0f=x2=LmXLqMh=I(W#~>q2JjW(p48IRxlbtoSz+)lA{e<_jXI^+zfP$H4p9-bS$qk9%~6o}vbU z2%h+UMh5b7CJ1JQsTxX7+`~h?P+<+>SH}qx6DS^R{v}zP14N!1@h&f~C<02B1A35- zN$1mt>>T6wzyxE`s|{vXYB%k^%&N%5!KT*un1x9d-Oa7O%9;rd%j=Xifi z{v(DpVUKH-4C;S)&c6Yky=~<5M^7jp;t@IVqdbm|C~LUcY_hFRdm#Ww!AeB`>|oi7 z->Gv#=$hEG$cM&rZB6}F}n~;pMm$|>lW-+#Tp9X2|P(gT&PAf)b zV`nEjvK>oB#h`(&1qfDL?pOaKd?srM8!mV1L;;$uWXtYR6G zgpfaqLR?@ES9&wn)=b<#Xm58<7=|F<+8hHwkPJNo+bBl2z}9}8<`hc$Yh00mA}T7r zEyLUE>uEs;%BZNA&zHY^$;kbbJ^~Knh+h9JPkosEE)q1_gE}A5CNbn@^zGbD7~VTR z$y~P)HG3hb%||)Thzm^nc$ZSPcV_o%x(ifeMkEPRWiU4Wcq%+l?mi2Pg1MTdC1+(7 zhjw^-cNk?81{Lqm9zQCwvW%P@BT7Q4A2(BoB z)W+piz3lqK)sejZ*f>#Or75HF+%HO9a1p+*+}7P4ys>Fk+y4?34J&74ef{H?MN