Merge branch 'master' into rugvip/annotations

This commit is contained in:
Patrik Oldsberg
2022-03-14 12:56:05 +01:00
committed by GitHub
74 changed files with 547 additions and 613 deletions
+22
View File
@@ -0,0 +1,22 @@
---
'@backstage/backend-test-utils': patch
'@backstage/create-app': patch
'@backstage/plugin-airbrake': patch
'@backstage/plugin-app-backend': patch
'@backstage/plugin-azure-devops-backend': patch
'@backstage/plugin-badges-backend': patch
'@backstage/plugin-bazaar-backend': patch
'@backstage/plugin-catalog-backend': patch
'@backstage/plugin-catalog-backend-module-msgraph': patch
'@backstage/plugin-jenkins-backend': patch
'@backstage/plugin-kafka': patch
'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch
'@backstage/plugin-scaffolder-backend-module-rails': patch
'@backstage/plugin-scaffolder-backend-module-yeoman': patch
'@backstage/plugin-tech-insights-backend': patch
'@backstage/plugin-tech-insights-backend-module-jsonfc': patch
'@backstage/plugin-todo': patch
'@backstage/plugin-todo-backend': patch
---
Minor README update
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': minor
---
**BREAKING**: The provided Jest configuration now only matches files with a `.test.` infix, rather than any files that is suffixed with `test.<ext>`. In particular this means that files named just `test.ts` will no longer be considered a test file.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/catalog-model': minor
---
**BREAKING**: Removed `EntityName`, use `CompoundEntityRef` type instead.
**BREAKING**: Removed `getEntityName`, use `getCompoundEntityRef` instead.
+10
View File
@@ -0,0 +1,10 @@
---
'@backstage/plugin-catalog-backend': minor
---
**BREAKING**: Removed the following deprecated symbols:
- `catalogBuilder.setRefreshInterval`, use `catalogBuilder.setProcessingInterval` instead.
- `catalogBuilder.setRefreshIntervalSeconds`, use `catalogBuilder.setProcessingIntervalSeconds` instead.
- `createRandomRefreshInterval`, use `createRandomProcessingInterval` instead.
- `RefreshIntervalFunction`, use `ProcessingIntervalFunction` instead.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': minor
---
**BREAKING**: The deprecated `CatalogEntityDocument` export has been removed, it can be imported from `@backstage/plugin-catalog-common` instead.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-react': minor
---
**BREAKING**: Removed the deprecated `formatEntityRefTitle`, use `humanizeEntityRef` instead.
+7 -10
View File
@@ -45,17 +45,14 @@ Add a `providerFactories` entry to the router in
```ts
import { createGcpIapProvider } from '@backstage/plugin-auth-backend';
export default async function createPlugin({
logger,
database,
config,
discovery,
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger,
config,
database,
discovery,
logger: env.logger,
config: env.config,
database: env.database,
discovery: env.discovery,
providerFactories: {
'gcp-iap': createGcpIapProvider({
// Replace the auth handler if you want to customize the returned user
+14 -14
View File
@@ -29,9 +29,9 @@ sign-in resolvers and set them for any of the Authentication providers inside
```ts
import { DEFAULT_NAMESPACE, stringifyEntityRef } from '@backstage/catalog-model';
export default async function createPlugin({
...
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
...
providerFactories: {
@@ -105,13 +105,13 @@ matching `google.com/email` annotation.
It can be enabled like this
```tsx
```ts
// File: packages/backend/src/plugins/auth.ts
import { googleEmailSignInResolver, createGoogleProvider } from '@backstage/plugin-auth-backend';
export default async function createPlugin({
...
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
...
providerFactories: {
@@ -130,9 +130,9 @@ can do this using the `CatalogIdentityClient` provided as context to Sign-In
resolvers:
```ts
export default async function createPlugin({
...
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
...
providerFactories: {
@@ -174,11 +174,11 @@ display name and profile picture.
This is also the place where you can do authorization and validation of the user
and throw errors if the user should not be allowed access in Backstage.
```tsx
```ts
// File: packages/backend/src/plugins/auth.ts
export default async function createPlugin({
...
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
...
providerFactories: {
+6 -6
View File
@@ -60,15 +60,15 @@ add the following:
```typescript
// In packages/backend/src/plugins/kubernetes.ts
import { KubernetesBuilder } from '@backstage/plugin-kubernetes-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
}: PluginEnvironment) {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const { router } = await KubernetesBuilder.createBuilder({
logger,
config,
logger: env.logger,
config: env.config,
}).build();
return router;
}
+19 -15
View File
@@ -150,20 +150,24 @@ import {
} from '@backstage/plugin-search-backend-node';
import { PluginEnvironment } from '../types';
import { DefaultCatalogCollator } from '@backstage/plugin-catalog-backend';
import { Router } from 'express';
export default async function createPlugin({
logger,
discovery,
tokenManager,
}: PluginEnvironment) {
const searchEngine = new LunrSearchEngine({ logger });
const indexBuilder = new IndexBuilder({ logger, searchEngine });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const searchEngine = new LunrSearchEngine({
logger: env.logger,
});
const indexBuilder = new IndexBuilder({
logger: env.logger,
searchEngine,
});
indexBuilder.addCollator({
defaultRefreshIntervalSeconds: 600,
collator: new DefaultCatalogCollator({
discovery,
tokenManager,
discovery: env.discovery,
tokenManager: env.tokenManager,
}),
});
@@ -174,7 +178,7 @@ export default async function createPlugin({
return await createRouter({
engine: indexBuilder.getSearchEngine(),
logger,
logger: env.logger,
});
}
```
@@ -285,13 +289,13 @@ which are responsible for providing documents
number of collators with the `IndexBuilder` like this:
```typescript
const indexBuilder = new IndexBuilder({ logger, searchEngine });
const indexBuilder = new IndexBuilder({ logger: env.logger, searchEngine });
indexBuilder.addCollator({
defaultRefreshIntervalSeconds: 600,
collator: new DefaultCatalogCollator({
discovery,
tokenManager,
discovery: env.discovery,
tokenManager: env.tokenManager,
}),
});
@@ -311,8 +315,8 @@ its `defaultRefreshIntervalSeconds` value, like this:
indexBuilder.addCollator({
defaultRefreshIntervalSeconds: 600,
collator: new DefaultCatalogCollator({
discovery,
tokenManager,
discovery: env.discovery,
tokenManager: env.tokenManager,
}),
});
```
+18 -14
View File
@@ -72,10 +72,10 @@ import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-techdocs-backe
```typescript
indexBuilder.addCollator({
defaultRefreshIntervalSeconds: 600,
factory: DefaultTechDocsCollatorFactory.fromConfig(config, {
discovery,
logger,
tokenManager,
factory: DefaultTechDocsCollatorFactory.fromConfig(env.config, {
discovery: env.discovery,
logger: env.logger,
tokenManager: env.tokenManager,
}),
});
```
@@ -120,9 +120,9 @@ provided by `@backstage/plugin-catalog-backend` offers some configuration too!
indexBuilder.addCollator({
defaultRefreshIntervalSeconds: 600,
collator: DefaultCatalogCollator.fromConfig(config, {
discovery,
tokenManager,
collator: DefaultCatalogCollator.fromConfig(env.config, {
discovery: env.discovery,
tokenManager: env.tokenManager,
+ filter: {
+ kind: ['API', 'Component', 'Domain', 'Group', 'System', 'User'],
+ },
@@ -167,18 +167,22 @@ provided by existing plugins, the migration process is fairly straightforward:
+import { DefaultCatalogCollatorFactory } from '@backstage/plugin-catalog-backend';
+import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-techdocs-backend';
// ...
const indexBuilder = new IndexBuilder({ logger, searchEngine });
const indexBuilder = new IndexBuilder({ logger: env.logger, searchEngine });
indexBuilder.addCollator({
defaultRefreshIntervalSeconds: 600,
- collator: DefaultCatalogCollator.fromConfig(config, { discovery }),
+ factory: DefaultCatalogCollatorFactory.fromConfig(config, { discovery }),
- collator: DefaultCatalogCollator.fromConfig(env.config, {
discovery: env.discovery,
}),
+ factory: DefaultCatalogCollatorFactory.fromConfig(env.config, {
discovery: env.discovery,
}),
});
indexBuilder.addCollator({
defaultRefreshIntervalSeconds: 600,
- collator: DefaultTechDocsCollator.fromConfig(config, {
+ factory: DefaultTechDocsCollatorFactory.fromConfig(config, {
discovery,
logger,
- collator: DefaultTechDocsCollator.fromConfig(env.config, {
+ factory: DefaultTechDocsCollatorFactory.fromConfig(env.config, {
discovery: env.discovery,
logger: env.logger,
}),
});
```
+9 -9
View File
@@ -17,7 +17,7 @@ provided search engines by using the exposed setter to set the modified query
translator into the instance.
```typescript
const searchEngine = new LunrSearchEngine({ logger });
const searchEngine = new LunrSearchEngine({ logger: env.logger });
searchEngine.setTranslator(new MyNewAndBetterQueryTranslator());
```
@@ -30,8 +30,8 @@ Lunr can be instantiated like this:
```typescript
// app/backend/src/plugins/search.ts
const searchEngine = new LunrSearchEngine({ logger });
const indexBuilder = new IndexBuilder({ logger, searchEngine });
const searchEngine = new LunrSearchEngine({ logger: env.logger });
const indexBuilder = new IndexBuilder({ logger: env.logger, searchEngine });
```
## Postgres
@@ -58,9 +58,9 @@ configured and make the following changes to your backend:
// In packages/backend/src/plugins/search.ts
// Initialize a connection to a search engine.
const searchEngine = (await PgSearchEngine.supported(database))
? await PgSearchEngine.from({ database })
: new LunrSearchEngine({ logger });
const searchEngine = (await PgSearchEngine.supported(env.database))
? await PgSearchEngine.from({ database: env.database })
: new LunrSearchEngine({ logger: env.logger });
```
## ElasticSearch
@@ -74,10 +74,10 @@ Similarly to Lunr above, ElasticSearch can be set up like this:
```typescript
// app/backend/src/plugins/search.ts
const searchEngine = await ElasticSearchSearchEngine.initialize({
logger,
config,
logger: env.logger,
config: env.config,
});
const indexBuilder = new IndexBuilder({ logger, searchEngine });
const indexBuilder = new IndexBuilder({ logger: env.logger, searchEngine });
```
For the engine to be available, your backend package needs a dependency into
@@ -64,7 +64,7 @@ spec:
This is the same entity as returned in JSON from the software catalog API:
```js
```json
{
"apiVersion": "backstage.io/v1alpha1",
"kind": "Component",
@@ -79,11 +79,13 @@ This is the same entity as returned in JSON from the software catalog API:
"labels": {
"example.com/custom": "custom_label_value"
},
"links": [{
"url": "https://admin.example-org.com",
"title": "Admin Dashboard",
"icon": "dashboard"
}],
"links": [
{
"url": "https://admin.example-org.com",
"title": "Admin Dashboard",
"icon": "dashboard"
}
],
"tags": ["java"],
"name": "artist-web",
"uid": "2152f463-549d-4d8d-a94d-ce2b7676c6e2"
@@ -108,11 +108,11 @@ should have something similar to the below in
```ts
return await createRouter({
containerRunner,
logger,
config,
database,
catalogClient,
reader,
logger: env.logger,
config: env.config,
database: env.database,
reader: env.reader,
});
```
@@ -123,25 +123,25 @@ will set the available actions that the scaffolder has access to.
import { createBuiltinActions } from '@backstage/plugin-scaffolder-backend';
import { ScmIntegrations } from '@backstage/integration';
const integrations = ScmIntegrations.fromConfig(config);
const integrations = ScmIntegrations.fromConfig(env.config);
const builtInActions = createBuiltinActions({
containerRunner,
integrations,
config,
catalogClient,
reader,
config: env.config,
reader: env.reader,
});
const actions = [...builtInActions, createNewFileAction()];
return await createRouter({
containerRunner,
logger,
config,
database,
catalogClient,
reader,
actions,
logger: env.logger,
config: env.config,
database: env.database,
reader: env.reader,
});
```
+15 -17
View File
@@ -81,18 +81,16 @@ import {
Publisher,
} from '@backstage/plugin-techdocs-backend';
import Docker from 'dockerode';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
discovery,
reader,
}: PluginEnvironment) {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
// Preparers are responsible for fetching source files for documentation.
const preparers = await Preparers.fromConfig(config, {
logger,
reader,
const preparers = await Preparers.fromConfig(env.config, {
logger: env.logger,
reader: env.reader,
});
// Docker client (conditionally) used by the generators, based on techdocs.generators config.
@@ -100,17 +98,17 @@ export default async function createPlugin({
const containerRunner = new DockerContainerRunner({ dockerClient });
// Generators are used for generating documentation sites.
const generators = await Generators.fromConfig(config, {
logger,
const generators = await Generators.fromConfig(env.config, {
logger: env.logger,
containerRunner,
});
// Publisher is used for
// 1. Publishing generated files to storage
// 2. Fetching files from storage and passing them to TechDocs frontend.
const publisher = await Publisher.fromConfig(config, {
logger,
discovery,
const publisher = await Publisher.fromConfig(env.config, {
logger: env.logger,
discovery: env.discovery,
});
// checks if the publisher is working and logs the result
@@ -120,9 +118,9 @@ export default async function createPlugin({
preparers,
generators,
publisher,
logger,
config,
discovery,
logger: env.logger,
config: env.config,
discovery: env.discovery,
});
}
```
+5 -5
View File
@@ -42,16 +42,16 @@ And then add the processors to your catalog builder:
env: PluginEnvironment,
): Promise<Router> {
const builder = await CatalogBuilder.create(env);
+ const integrations = ScmIntegrations.fromConfig(config);
+ const integrations = ScmIntegrations.fromConfig(env.config);
+ const githubCredentialsProvider =
+ DefaultGithubCredentialsProvider.fromIntegrations(integrations);
+ builder.addProcessor(
+ GithubDiscoveryProcessor.fromConfig(config, {
+ logger,
+ GithubDiscoveryProcessor.fromConfig(env.config, {
+ logger: env.logger,
+ githubCredentialsProvider,
+ }),
+ GithubOrgReaderProcessor.fromConfig(config, {
+ logger,
+ GithubOrgReaderProcessor.fromConfig(env.config, {
+ logger: env.logger,
+ githubCredentialsProvider,
+ }),
+ );
+1 -1
View File
@@ -69,6 +69,6 @@ import { GithubOrgReaderProcessor } from '@backstage/plugin-catalog-backend';
builder.replaceProcessors(
// ... other processor replacements
GithubOrgReaderProcessor.fromConfig(config, { logger }),
GithubOrgReaderProcessor.fromConfig(env.config, { logger: env.logger }),
);
```
+7 -2
View File
@@ -76,9 +76,12 @@ following to it
```ts
import { createRouter } from '@internal/plugin-carmen-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin(env: PluginEnvironment) {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
// Here is where you will add all of the required initialization code that
// your backend plugin needs to be able to start!
@@ -124,7 +127,9 @@ function, there is a `database` field. You can use that to get a
```ts
// in packages/backend/src/plugins/carmen.ts
export default async function createPlugin(env: PluginEnvironment) {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const db: Knex<any, unknown[]> = await env.database.getClient();
// You will then pass this client into your actual plugin implementation
+7 -7
View File
@@ -192,7 +192,7 @@ returns a result or displays an error or console message, like so:
**`StringUtil ellipsis`**
```js
```ts
export function ellipsis(text, maxLength, midCharIx = 0, ellipsis = '...') {
// Do something blackbox. We should not care about the internals,
// only inputs and outputs.
@@ -210,7 +210,7 @@ There are four things to test for in a utility function:
> Handle Invalid Input (handle thrown errors):
```js
```ts
it('Throws an error on improper arguments', () => {
expect(() => {
ellipsis();
@@ -220,7 +220,7 @@ it('Throws an error on improper arguments', () => {
> Verify default input arguments:
```js
```ts
it('Works with defaults', () => {
expect(ellipsis('Hello world', 3)).toBe('Hel...');
expect(ellipsis('', 3)).toBe('');
@@ -233,7 +233,7 @@ it('Works with defaults', () => {
This is especially true for edge cases!
```js
```ts
it('Works with midCharIx', () => {
expect(ellipsis('Hello world', 3, 6)).toBe('...o w...');
expect(ellipsis('', 3, 6)).toBe('');
@@ -265,7 +265,7 @@ For example:
**`./MyApi.js`**
```js
```ts
export {
fetchSomethingFromServer: () => {
// Live production call to a URI. Must be avoided during testing!
@@ -276,7 +276,7 @@ export {
**`./__mocks__/MyApi.js`**
```js
```ts
export {
fetchSomethingFromServer: () => {
// Simulate a production call, but avoid jest and just use a promise
@@ -287,7 +287,7 @@ export {
**`./MyApi.test.js`**
```js
```ts
/* eslint-disable import/first */
jest.mock('./MyApi'); // Instruct Jest to swap all future imports of './MyApi.js' to './__mocks__/MyApi.js'
+1 -1
View File
@@ -44,7 +44,7 @@ import { URLReaders } from '@backstage/backend-common';
function makeCreateEnv(config: Config) {
// ....
const reader = UrlReaders.default({ logger, config });
const reader = UrlReaders.default({ logger: root, config });
//
}
```
+6 -8
View File
@@ -18,15 +18,13 @@ import { createRouter } from '@backstage/plugin-app-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
database,
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger,
config,
database,
logger: env.logger,
config: env.config,
database: env.database,
appPackageName: 'example-app',
});
}
+8 -12
View File
@@ -18,18 +18,14 @@ import { createRouter } from '@backstage/plugin-auth-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
database,
config,
discovery,
tokenManager,
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger,
config,
database,
discovery,
tokenManager,
logger: env.logger,
config: env.config,
database: env.database,
discovery: env.discovery,
tokenManager: env.tokenManager,
});
}
+7 -5
View File
@@ -18,9 +18,11 @@ import { createRouter } from '@backstage/plugin-azure-devops-backend';
import { Router } from 'express';
import type { PluginEnvironment } from '../types';
export default function createPlugin({
logger,
config,
}: PluginEnvironment): Promise<Router> {
return createRouter({ logger, config });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return createRouter({
logger: env.logger,
config: env.config,
});
}
+6 -6
View File
@@ -18,15 +18,15 @@ import {
createRouter,
createDefaultBadgeFactories,
} from '@backstage/plugin-badges-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
config,
discovery,
}: PluginEnvironment) {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
config,
discovery,
config: env.config,
discovery: env.discovery,
badgeFactories: createDefaultBadgeFactories(),
});
}
+4 -1
View File
@@ -15,9 +15,12 @@
*/
import { createRouter } from '@backstage/plugin-code-coverage-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin(env: PluginEnvironment) {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
config: env.config,
discovery: env.discovery,
+5 -6
View File
@@ -18,12 +18,11 @@ import { createRouter } from '@backstage/plugin-graphql-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger,
config,
logger: env.logger,
config: env.config,
});
}
+7 -4
View File
@@ -18,8 +18,11 @@ import { createStatusCheckRouter } from '@backstage/backend-common';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createRouter({
logger,
}: PluginEnvironment): Promise<Router> {
return await createStatusCheckRouter({ logger, path: '/healthcheck' });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createStatusCheckRouter({
logger: env.logger,
path: '/healthcheck',
});
}
+6 -8
View File
@@ -22,18 +22,16 @@ import { Router } from 'express';
import { PluginEnvironment } from '../types';
import { CatalogClient } from '@backstage/catalog-client';
export default async function createPlugin({
logger,
config,
discovery,
}: PluginEnvironment): Promise<Router> {
const catalog = new CatalogClient({ discoveryApi: discovery });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const catalog = new CatalogClient({ discoveryApi: env.discovery });
return await createRouter({
logger,
logger: env.logger,
jenkinsInfoProvider: DefaultJenkinsInfoProvider.fromConfig({
catalog,
config,
config: env.config,
}),
});
}
+7 -5
View File
@@ -18,9 +18,11 @@ import { createRouter } from '@backstage/plugin-kafka-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
}: PluginEnvironment): Promise<Router> {
return await createRouter({ logger, config });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger: env.logger,
config: env.config,
});
}
+6 -6
View File
@@ -15,15 +15,15 @@
*/
import { KubernetesBuilder } from '@backstage/plugin-kubernetes-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
}: PluginEnvironment) {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const { router } = await KubernetesBuilder.createBuilder({
logger,
config,
logger: env.logger,
config: env.config,
}).build();
return router;
}
+5 -6
View File
@@ -35,15 +35,14 @@ class AllowAllPermissionPolicy implements PermissionPolicy {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const { logger, discovery, config } = env;
return await createRouter({
config,
logger,
discovery,
config: env.config,
logger: env.logger,
discovery: env.discovery,
policy: new AllowAllPermissionPolicy(),
identity: IdentityClient.create({
discovery,
issuer: await discovery.getExternalBaseUrl('auth'),
discovery: env.discovery,
issuer: await env.discovery.getExternalBaseUrl('auth'),
}),
});
}
+8 -6
View File
@@ -18,10 +18,12 @@ import { createRouter } from '@backstage/plugin-proxy-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
discovery,
}: PluginEnvironment): Promise<Router> {
return await createRouter({ logger, config, discovery });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger: env.logger,
config: env.config,
discovery: env.discovery,
});
}
+7 -5
View File
@@ -18,9 +18,11 @@ import { createRouter } from '@backstage/plugin-rollbar-backend';
import { Router } from 'express';
import type { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
}: PluginEnvironment): Promise<Router> {
return await createRouter({ logger, config });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger: env.logger,
config: env.config,
});
}
+12 -13
View File
@@ -19,19 +19,18 @@ import { createRouter } from '@backstage/plugin-scaffolder-backend';
import { Router } from 'express';
import type { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
database,
reader,
discovery,
}: PluginEnvironment): Promise<Router> {
const catalogClient = new CatalogClient({ discoveryApi: discovery });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const catalogClient = new CatalogClient({
discoveryApi: env.discovery,
});
return await createRouter({
logger,
config,
database,
catalogClient,
reader,
logger: env.logger,
config: env.config,
database: env.database,
catalogClient: catalogClient,
reader: env.reader,
});
}
+30 -41
View File
@@ -13,11 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
PluginDatabaseManager,
useHotCleanup,
} from '@backstage/backend-common';
import { Config } from '@backstage/config';
import { useHotCleanup } from '@backstage/backend-common';
import { DefaultCatalogCollatorFactory } from '@backstage/plugin-catalog-backend';
import { createRouter } from '@backstage/plugin-search-backend';
import { ElasticSearchSearchEngine } from '@backstage/plugin-search-backend-module-elasticsearch';
@@ -28,60 +25,52 @@ import {
SearchEngine,
} from '@backstage/plugin-search-backend-node';
import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-techdocs-backend';
import { Logger } from 'winston';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
async function createSearchEngine({
logger,
database,
config,
}: {
logger: Logger;
database: PluginDatabaseManager;
config: Config;
}): Promise<SearchEngine> {
if (config.has('search.elasticsearch')) {
async function createSearchEngine(
env: PluginEnvironment,
): Promise<SearchEngine> {
if (env.config.has('search.elasticsearch')) {
return await ElasticSearchSearchEngine.fromConfig({
logger,
config,
logger: env.logger,
config: env.config,
});
}
if (await PgSearchEngine.supported(database)) {
return await PgSearchEngine.from({ database });
if (await PgSearchEngine.supported(env.database)) {
return await PgSearchEngine.from({ database: env.database });
}
return new LunrSearchEngine({ logger });
return new LunrSearchEngine({ logger: env.logger });
}
export default async function createPlugin({
logger,
permissions,
discovery,
config,
database,
tokenManager,
}: PluginEnvironment) {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
// Initialize a connection to a search engine.
const searchEngine = await createSearchEngine({ config, logger, database });
const indexBuilder = new IndexBuilder({ logger, searchEngine });
const searchEngine = await createSearchEngine(env);
const indexBuilder = new IndexBuilder({
logger: env.logger,
searchEngine,
});
// Collators are responsible for gathering documents known to plugins. This
// particular collator gathers entities from the software catalog.
indexBuilder.addCollator({
defaultRefreshIntervalSeconds: 600,
factory: DefaultCatalogCollatorFactory.fromConfig(config, {
discovery,
tokenManager,
factory: DefaultCatalogCollatorFactory.fromConfig(env.config, {
discovery: env.discovery,
tokenManager: env.tokenManager,
}),
});
indexBuilder.addCollator({
defaultRefreshIntervalSeconds: 600,
factory: DefaultTechDocsCollatorFactory.fromConfig(config, {
discovery,
logger,
tokenManager,
factory: DefaultTechDocsCollatorFactory.fromConfig(env.config, {
discovery: env.discovery,
logger: env.logger,
tokenManager: env.tokenManager,
}),
});
@@ -97,8 +86,8 @@ export default async function createPlugin({
return await createRouter({
engine: indexBuilder.getSearchEngine(),
types: indexBuilder.getDocumentTypes(),
permissions,
config,
logger,
permissions: env.permissions,
config: env.config,
logger: env.logger,
});
}
+11 -13
View File
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
createRouter,
buildTechInsightsContext,
@@ -28,17 +29,14 @@ import {
JSON_RULE_ENGINE_CHECK_TYPE,
} from '@backstage/plugin-tech-insights-backend-module-jsonfc';
export default async function createPlugin({
logger,
config,
discovery,
database,
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const techInsightsContext = await buildTechInsightsContext({
logger,
config,
database,
discovery,
logger: env.logger,
config: env.config,
database: env.database,
discovery: env.discovery,
factRetrievers: [
createFactRetrieverRegistration({
cadence: '1 1 1 * *', // Example cron, At 01:01 on day-of-month 1.
@@ -54,6 +52,7 @@ export default async function createPlugin({
}),
],
factCheckerFactory: new JsonRulesEngineFactCheckerFactory({
logger: env.logger,
checks: [
{
id: 'simpleTestCheck',
@@ -93,13 +92,12 @@ export default async function createPlugin({
},
},
],
logger,
}),
});
return await createRouter({
...techInsightsContext,
logger,
config,
logger: env.logger,
config: env.config,
});
}
+16 -19
View File
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { DockerContainerRunner } from '@backstage/backend-common';
import {
createRouter,
@@ -24,17 +25,13 @@ import Docker from 'dockerode';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
discovery,
reader,
cache,
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
// Preparers are responsible for fetching source files for documentation.
const preparers = await Preparers.fromConfig(config, {
logger,
reader,
const preparers = await Preparers.fromConfig(env.config, {
logger: env.logger,
reader: env.reader,
});
// Docker client (conditionally) used by the generators, based on techdocs.generators config.
@@ -42,17 +39,17 @@ export default async function createPlugin({
const containerRunner = new DockerContainerRunner({ dockerClient });
// Generators are used for generating documentation sites.
const generators = await Generators.fromConfig(config, {
logger,
const generators = await Generators.fromConfig(env.config, {
logger: env.logger,
containerRunner,
});
// Publisher is used for
// 1. Publishing generated files to storage
// 2. Fetching files from storage and passing them to TechDocs frontend.
const publisher = await Publisher.fromConfig(config, {
logger,
discovery,
const publisher = await Publisher.fromConfig(env.config, {
logger: env.logger,
discovery: env.discovery,
});
// checks if the publisher is working and logs the result
@@ -62,9 +59,9 @@ export default async function createPlugin({
preparers,
generators,
publisher,
logger,
config,
discovery,
cache,
logger: env.logger,
config: env.config,
discovery: env.discovery,
cache: env.cache,
});
}
+14 -11
View File
@@ -22,21 +22,24 @@ import {
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
reader,
config,
discovery,
}: PluginEnvironment): Promise<Router> {
const todoReader = TodoScmReader.fromConfig(config, {
logger,
reader,
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const todoReader = TodoScmReader.fromConfig(env.config, {
logger: env.logger,
reader: env.reader,
});
const catalogClient = new CatalogClient({ discoveryApi: discovery });
const catalogClient = new CatalogClient({
discoveryApi: env.discovery,
});
const todoService = new TodoReaderService({
todoReader,
catalogClient,
});
return await createRouter({ todoService });
return await createRouter({
todoService,
});
}
-6
View File
@@ -175,9 +175,6 @@ export type EntityMeta = JsonObject & {
links?: EntityLink[];
};
// @public @deprecated
export type EntityName = CompoundEntityRef;
// @public
export const EntityPolicies: {
allOf(policies: EntityPolicy[]): EntityPolicy;
@@ -226,9 +223,6 @@ export class FieldFormatEntityPolicy implements EntityPolicy {
// @public
export function getCompoundEntityRef(entity: Entity): CompoundEntityRef;
// @public @deprecated
export const getEntityName: typeof getCompoundEntityRef;
// @public
export function getEntitySourceLocation(entity: Entity): {
type: string;
@@ -35,7 +35,6 @@ export type {
export * from './policies';
export {
getCompoundEntityRef,
getEntityName,
parseEntityRef,
stringifyEntityRef,
} from './ref';
-11
View File
@@ -44,17 +44,6 @@ function parseRefString(ref: string): {
return { kind, namespace, name };
}
/**
* Extracts the kind, namespace and name that form the compound entity ref
* triplet of the given entity.
*
* @public
* @deprecated Use getCompoundEntityRef instead
* @param entity - An entity
* @returns The compound entity ref
*/
export const getEntityName = getCompoundEntityRef;
/**
* Extracts the kind, namespace and name that form the compound entity ref
* triplet of the given entity.
+1 -1
View File
@@ -24,5 +24,5 @@ export * from './entity';
export { EntityPolicies } from './EntityPolicies';
export * from './kinds';
export * from './location';
export type { EntityName, CompoundEntityRef } from './types';
export type { CompoundEntityRef } from './types';
export * from './validation';
-8
View File
@@ -25,11 +25,3 @@ export type CompoundEntityRef = {
namespace: string;
name: string;
};
/**
* A complete entity name, with the full kind-namespace-name triplet.
*
* @deprecated Use CompoundEntityRef instead
* @public
*/
export type EntityName = CompoundEntityRef;
+1 -1
View File
@@ -112,7 +112,7 @@ async function getProjectConfig(targetPath, displayName) {
},
// A bit more opinionated
testMatch: ['**/?(*.)test.{js,jsx,ts,tsx,mjs,cjs}'],
testMatch: ['**/*.test.{js,jsx,ts,tsx,mjs,cjs}'],
transformIgnorePatterns: [`/node_modules/(?:${transformIgnorePattern})/`],
};
@@ -2,15 +2,13 @@ import { createRouter } from '@backstage/plugin-app-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
database,
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger,
config,
database,
logger: env.logger,
config: env.config,
database: env.database,
appPackageName: 'app',
});
}
@@ -2,18 +2,14 @@ import { createRouter } from '@backstage/plugin-auth-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
database,
config,
discovery,
tokenManager,
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger,
config,
database,
discovery,
tokenManager,
logger: env.logger,
config: env.config,
database: env.database,
discovery: env.discovery,
tokenManager: env.tokenManager,
});
}
@@ -2,10 +2,12 @@ import { createRouter } from '@backstage/plugin-proxy-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
discovery,
}: PluginEnvironment): Promise<Router> {
return await createRouter({ logger, config, discovery });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger: env.logger,
config: env.config,
discovery: env.discovery,
});
}
@@ -3,19 +3,18 @@ import { createRouter } from '@backstage/plugin-scaffolder-backend';
import { Router } from 'express';
import type { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
database,
reader,
discovery,
}: PluginEnvironment): Promise<Router> {
const catalogClient = new CatalogClient({ discoveryApi: discovery });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const catalogClient = new CatalogClient({
discoveryApi: env.discovery,
});
return await createRouter({
logger,
config,
database,
logger: env.logger,
config: env.config,
database: env.database,
reader: env.reader,
catalogClient,
reader,
});
}
@@ -10,42 +10,44 @@ import { PgSearchEngine } from '@backstage/plugin-search-backend-module-pg';
import { PluginEnvironment } from '../types';
import { DefaultCatalogCollatorFactory } from '@backstage/plugin-catalog-backend';
import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-techdocs-backend';
import { Router } from 'express';
export default async function createPlugin({
logger,
permissions,
discovery,
config,
tokenManager,
}: PluginEnvironment) {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
// Initialize a connection to a search engine.
{{#if dbTypeSqlite}}
const searchEngine = new LunrSearchEngine({ logger });
const searchEngine = new LunrSearchEngine({
logger: env.logger,
});
{{/if}}
{{#if dbTypePG}}
const searchEngine = (await PgSearchEngine.supported(database))
? await PgSearchEngine.from({ database })
: new LunrSearchEngine({ logger });
const searchEngine = (await PgSearchEngine.supported(env.database))
? await PgSearchEngine.from({ database: env.database })
: new LunrSearchEngine({ logger: env.logger });
{{/if}}
const indexBuilder = new IndexBuilder({ logger, searchEngine });
const indexBuilder = new IndexBuilder({
logger: env.logger,
searchEngine,
});
// Collators are responsible for gathering documents known to plugins. This
// collator gathers entities from the software catalog.
indexBuilder.addCollator({
defaultRefreshIntervalSeconds: 600,
factory: DefaultCatalogCollatorFactory.fromConfig(config, {
discovery,
tokenManager,
factory: DefaultCatalogCollatorFactory.fromConfig(env.config, {
discovery: env.discovery,
tokenManager: env.tokenManager,
}),
});
// collator gathers entities from techdocs.
indexBuilder.addCollator({
defaultRefreshIntervalSeconds: 600,
factory: DefaultTechDocsCollatorFactory.fromConfig(config, {
discovery,
logger,
tokenManager,
factory: DefaultTechDocsCollatorFactory.fromConfig(env.config, {
discovery: env.discovery,
logger: env.logger,
tokenManager: env.tokenManager,
}),
});
@@ -61,8 +63,8 @@ export default async function createPlugin({
return await createRouter({
engine: indexBuilder.getSearchEngine(),
types: indexBuilder.getDocumentTypes(),
permissions,
config,
logger,
permissions: env.permissions,
config: env.config,
logger: env.logger,
});
}
@@ -9,17 +9,13 @@ import Docker from 'dockerode';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
discovery,
reader,
cache,
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
// Preparers are responsible for fetching source files for documentation.
const preparers = await Preparers.fromConfig(config, {
logger,
reader,
const preparers = await Preparers.fromConfig(env.config, {
logger: env.logger,
reader: env.reader,
});
// Docker client (conditionally) used by the generators, based on techdocs.generators config.
@@ -27,17 +23,17 @@ export default async function createPlugin({
const containerRunner = new DockerContainerRunner({ dockerClient });
// Generators are used for generating documentation sites.
const generators = await Generators.fromConfig(config, {
logger,
const generators = await Generators.fromConfig(env.config, {
logger: env.logger,
containerRunner,
});
// Publisher is used for
// 1. Publishing generated files to storage
// 2. Fetching files from storage and passing them to TechDocs frontend.
const publisher = await Publisher.fromConfig(config, {
logger,
discovery,
const publisher = await Publisher.fromConfig(env.config, {
logger: env.logger,
discovery: env.discovery,
});
// checks if the publisher is working and logs the result
@@ -47,9 +43,9 @@ export default async function createPlugin({
preparers,
generators,
publisher,
logger,
config,
discovery,
cache,
logger: env.logger,
config: env.config,
discovery: env.discovery,
cache: env.cache,
});
}
+5 -6
View File
@@ -60,13 +60,12 @@ The Airbrake plugin provides connectivity between Backstage and Airbrake (https:
extractAirbrakeConfig,
} from '@backstage/plugin-airbrake-backend';
export default async function createPlugin({
logger,
config,
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return createRouter({
logger,
airbrakeConfig: extractAirbrakeConfig(config),
logger: env.logger,
airbrakeConfig: extractAirbrakeConfig(env.config),
});
}
```
+1 -1
View File
@@ -18,7 +18,7 @@ Now add the plugin router to your app, creating it for example like this:
```ts
const router = await createRouter({
logger,
logger: env.logger,
appPackageName: 'example-app',
});
```
+7 -5
View File
@@ -43,11 +43,13 @@ Here's how to get the backend up and running:
import { Router } from 'express';
import type { PluginEnvironment } from '../types';
export default function createPlugin({
logger,
config,
}: PluginEnvironment): Promise<Router> {
return createRouter({ logger, config });
export default function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return createRouter({
logger: env.logger,
config: env.config,
});
}
```
+6 -6
View File
@@ -20,15 +20,15 @@ import {
createRouter,
createDefaultBadgeFactories,
} from '@backstage/plugin-badges-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
config,
discovery,
}: PluginEnvironment) {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
config,
discovery,
config: env.config,
discovery: env.discovery,
badgeFactories: createDefaultBadgeFactories(),
});
}
+9 -6
View File
@@ -19,13 +19,16 @@ You'll need to add the plugin to the router in your `backend` package. You can d
```tsx
import { PluginEnvironment } from '../types';
import { createRouter } from '@backstage/plugin-bazaar-backend';
import { Router } from 'express';
export default async function createPlugin({
logger,
database,
config,
}: PluginEnvironment) {
return await createRouter({ logger, config, database });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger: env.logger,
config: env.config,
database: env.database,
});
}
```
@@ -117,8 +117,8 @@ useHotCleanup(
```typescript
// packages/backend/src/plugins/catalog.ts
builder.addProcessor(
MicrosoftGraphOrgReaderProcessor.fromConfig(config, {
logger,
MicrosoftGraphOrgReaderProcessor.fromConfig(env.config, {
logger: env.logger,
}),
);
```
@@ -173,8 +173,8 @@ export async function myGroupTransformer(
```ts
builder.addProcessor(
MicrosoftGraphOrgReaderProcessor.fromConfig(config, {
logger,
MicrosoftGraphOrgReaderProcessor.fromConfig(env.config, {
logger: env.logger,
groupTransformer: myGroupTransformer,
}),
);
+2 -18
View File
@@ -6,7 +6,7 @@
/// <reference types="node" />
import { CatalogApi } from '@backstage/catalog-client';
import { CatalogEntityDocument as CatalogEntityDocument_2 } from '@backstage/plugin-catalog-common';
import { CatalogEntityDocument } from '@backstage/plugin-catalog-common';
import { CompoundEntityRef } from '@backstage/catalog-model';
import { ConditionalPolicyDecision } from '@backstage/plugin-permission-node';
import { Conditions } from '@backstage/plugin-permission-node';
@@ -142,10 +142,6 @@ export class CatalogBuilder {
processingInterval: ProcessingIntervalFunction,
): CatalogBuilder;
setProcessingIntervalSeconds(seconds: number): CatalogBuilder;
// @deprecated
setRefreshInterval(refreshInterval: RefreshIntervalFunction): CatalogBuilder;
// @deprecated
setRefreshIntervalSeconds(seconds: number): CatalogBuilder;
}
// @alpha
@@ -174,9 +170,6 @@ export const catalogConditions: Conditions<{
>;
}>;
// @public @deprecated (undocumented)
export type CatalogEntityDocument = CatalogEntityDocument_2;
// @public (undocumented)
export type CatalogEnvironment = {
logger: Logger;
@@ -327,12 +320,6 @@ export function createRandomProcessingInterval(options: {
maxSeconds: number;
}): ProcessingIntervalFunction;
// @public @deprecated
export function createRandomRefreshInterval(options: {
minSeconds: number;
maxSeconds: number;
}): RefreshIntervalFunction;
// @public
export function createRouter(options: RouterOptions): Promise<express.Router>;
@@ -355,7 +342,7 @@ export class DefaultCatalogCollator {
// (undocumented)
protected discovery: PluginEndpointDiscovery;
// (undocumented)
execute(): Promise<CatalogEntityDocument_2[]>;
execute(): Promise<CatalogEntityDocument[]>;
// (undocumented)
protected filter?: GetEntitiesRequest['filter'];
// (undocumented)
@@ -814,9 +801,6 @@ export type RecursivePartial<T> = {
: T[P];
};
// @public @deprecated
export type RefreshIntervalFunction = () => number;
// @public
export type RefreshOptions = {
entityRef: string;
@@ -23,11 +23,5 @@ export type {
} from './types';
export { DefaultCatalogProcessingOrchestrator } from './DefaultCatalogProcessingOrchestrator';
export {
createRandomRefreshInterval,
createRandomProcessingInterval,
} from './refresh';
export type {
RefreshIntervalFunction,
ProcessingIntervalFunction,
} from './refresh';
export { createRandomProcessingInterval } from './refresh';
export type { ProcessingIntervalFunction } from './refresh';
@@ -14,35 +14,12 @@
* limitations under the License.
*/
/**
* Function that returns the catalog refresh interval in seconds.
* @deprecated use {@link ProcessingIntervalFunction} instead
* @public
*/
export type RefreshIntervalFunction = () => number;
/**
* Function that returns the catalog processing interval in seconds.
* @public
*/
export type ProcessingIntervalFunction = () => number;
/**
* Creates a function that returns a random refresh interval between minSeconds and maxSeconds.
* @returns A {@link RefreshIntervalFunction} that provides the next refresh interval
* @deprecated use {@link createRandomProcessingInterval} instead
* @public
*/
export function createRandomRefreshInterval(options: {
minSeconds: number;
maxSeconds: number;
}): RefreshIntervalFunction {
const { minSeconds, maxSeconds } = options;
return () => {
return Math.random() * (maxSeconds - minSeconds) + minSeconds;
};
}
/**
* Creates a function that returns a random processing interval between minSeconds and maxSeconds.
* @returns A {@link ProcessingIntervalFunction} that provides the next processing interval
@@ -17,14 +17,6 @@
export { DefaultCatalogCollatorFactory } from './DefaultCatalogCollatorFactory';
export type { DefaultCatalogCollatorFactoryOptions } from './DefaultCatalogCollatorFactory';
import { CatalogEntityDocument as CatalogEntityDocumentType } from '@backstage/plugin-catalog-common';
/**
* @deprecated import from `@backstage/plugin-catalog-common` instead
* @public
*/
export type CatalogEntityDocument = CatalogEntityDocumentType;
/**
* todo(backstage/techdocs-core): stop exporting this in a future release.
*/
@@ -68,7 +68,6 @@ import { DefaultCatalogProcessingOrchestrator } from '../processing/DefaultCatal
import { Stitcher } from '../stitching/Stitcher';
import {
createRandomProcessingInterval,
RefreshIntervalFunction,
ProcessingIntervalFunction,
} from '../processing/refresh';
import { createRouter } from './createRouter';
@@ -179,25 +178,6 @@ export class CatalogBuilder {
return this;
}
/**
* Refresh interval determines how often entities should be refreshed.
* Seconds provided will be multiplied by 1.5
* The default refresh duration is 100-150 seconds.
* setting this too low will potentially deplete request quotas to upstream services.
*
* @deprecated use {@link CatalogBuilder#setProcessingIntervalSeconds} instead
*/
setRefreshIntervalSeconds(seconds: number): CatalogBuilder {
this.env.logger.warn(
'[DEPRECATION] - CatalogBuilder.setRefreshIntervalSeconds is deprecated. Use CatalogBuilder.setProcessingIntervalSeconds instead.',
);
this.processingInterval = createRandomProcessingInterval({
minSeconds: seconds,
maxSeconds: seconds * 1.5,
});
return this;
}
/**
* Processing interval determines how often entities should be processed.
* Seconds provided will be multiplied by 1.5
@@ -212,20 +192,6 @@ export class CatalogBuilder {
return this;
}
/**
* Overwrites the default refresh interval function used to spread
* entity updates in the catalog.
*
* @deprecated use {@link CatalogBuilder#setProcessingInterval} instead
*/
setRefreshInterval(refreshInterval: RefreshIntervalFunction): CatalogBuilder {
this.env.logger.warn(
'[DEPRECATION] - CatalogBuilder.setRefreshInterval is deprecated. Use CatalogBuilder.setProcessingInterval instead.',
);
this.processingInterval = refreshInterval;
return this;
}
/**
* Overwrites the default processing interval function used to spread
* entity updates in the catalog.
-3
View File
@@ -401,9 +401,6 @@ export const favoriteEntityTooltip: (
isStarred: boolean,
) => 'Remove from favorites' | 'Add to favorites';
// @public @deprecated (undocumented)
export const formatEntityRefTitle: typeof humanizeEntityRef;
// @public
export function getEntityRelations(
entity: Entity | undefined,
@@ -16,7 +16,7 @@
import { humanizeEntityRef } from './humanize';
describe('formatEntityRefTitle', () => {
describe('humanizeEntityRef', () => {
it('formats entity in default namespace', () => {
const entity = {
apiVersion: 'v1',
@@ -20,9 +20,6 @@ import {
DEFAULT_NAMESPACE,
} from '@backstage/catalog-model';
/** @public @deprecated please use {@link humanizeEntityRef} instead */
export const formatEntityRefTitle = humanizeEntityRef;
/** @public */
export function humanizeEntityRef(
entityRef: Entity | CompoundEntityRef,
@@ -18,4 +18,4 @@ export { EntityRefLink } from './EntityRefLink';
export type { EntityRefLinkProps } from './EntityRefLink';
export { EntityRefLinks } from './EntityRefLinks';
export type { EntityRefLinksProps } from './EntityRefLinks';
export { humanizeEntityRef, formatEntityRefTitle } from './humanize';
export { humanizeEntityRef } from './humanize';
+8 -8
View File
@@ -31,17 +31,17 @@ import { CatalogClient } from '@backstage/catalog-client';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
discovery,
}: PluginEnvironment): Promise<Router> {
const catalog = new CatalogClient({ discoveryApi: discovery });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const catalog = new CatalogClient({
discoveryApi: env.discovery,
});
return await createRouter({
logger,
logger: env.logger,
jenkinsInfoProvider: DefaultJenkinsInfoProvider.fromConfig({
config,
config: env.config,
catalog,
}),
});
+8 -5
View File
@@ -18,13 +18,16 @@ In a new file named `kafka.ts` under `backend/src/plugins`:
```js
import { createRouter } from '@backstage/plugin-kafka-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
}: PluginEnvironment) {
return await createRouter({ logger, config });
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({
logger: env.logger,
config: env.config,
});
}
```
@@ -22,7 +22,7 @@ Configure the action:
const actions = [
createFetchCookiecutterAction({
integrations,
reader,
reader: env.reader,
containerRunner,
}),
...createBuiltInActions({
@@ -32,12 +32,12 @@ const actions = [
return await createRouter({
containerRunner,
logger,
config,
database,
catalogClient,
reader,
actions,
logger: env.logger,
config: env.config,
database: env.database,
reader: env.reader,
});
```
@@ -26,19 +26,19 @@ see all options):
const actions = [
createFetchRailsAction({
integrations,
reader,
reader: env.reader,
containerRunner,
}),
];
return await createRouter({
containerRunner,
logger,
config,
database,
catalogClient,
reader,
actions,
logger: env.logger,
config: env.config,
database: env.database,
reader: env.reader,
});
```
@@ -23,21 +23,21 @@ const actions = [
createRunYeomanAction(),
...createBuiltInActions({
containerRunner,
integrations,
config,
catalogClient,
reader,
integrations,
config: env.config,
reader: env.reader,
}),
];
return await createRouter({
containerRunner,
logger,
config,
database,
catalogClient,
reader,
actions,
logger: env.logger,
config: env.config,
database: env.database,
reader: env.reader,
});
```
@@ -21,14 +21,14 @@ and modify the `techInsights.ts` file to contain a reference to the FactCheckers
+const myFactCheckerFactory = new JsonRulesEngineFactCheckerFactory({
+ checks: [],
+ logger,
+ logger: env.logger,
+}),
const builder = buildTechInsightsContext({
logger,
config,
database,
discovery,
logger: env.logger,
config: env.config,
database: env.database,
discovery: env.discovery,
factRetrievers: [myFactRetrieverRegistration],
+ factCheckerFactory: myFactCheckerFactory
});
@@ -40,7 +40,7 @@ By default this implementation comes with an in-memory storage to store checks.
const myTechInsightCheckRegistry: TechInsightCheckRegistry<MyCheckType> = // snip
const myFactCheckerFactory = new JsonRulesEngineFactCheckerFactory({
checks: [],
logger,
logger: env.logger,
+ checkRegistry: myTechInsightCheckRegistry
}),
@@ -95,7 +95,7 @@ json-rules-engine supports a limited [number of built-in operators](https://gith
const myFactCheckerFactory = new JsonRulesEngineFactCheckerFactory({
checks: [],
logger,
logger: env.logger,
+ operators: [ new Operator("startsWith", (a, b) => a.startsWith(b) ]
})
```
+23 -26
View File
@@ -27,24 +27,21 @@ import {
import { Router } from 'express';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
config,
discovery,
database,
}: PluginEnvironment): Promise<Router> {
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const builder = buildTechInsightsContext({
logger,
config,
database,
discovery,
logger: env.logger,
config: env.config,
database: env.database,
discovery: env.discovery,
factRetrievers: [], // Fact retrievers registrations you want tech insights to use
});
return await createRouter({
...(await builder),
logger,
config,
logger: env.logger,
config: env.config,
});
}
```
@@ -103,10 +100,10 @@ To register these fact retrievers to your application you can modify the example
```diff
const builder = new DefaultTechInsightsBuilder({
logger,
config,
database,
discovery,
logger: env.logger,
config: env.config,
database: env.database,
discovery: env.discovery,
- factRetrievers: [],
+ factRetrievers: [myFactRetrieverRegistration],
});
@@ -118,10 +115,10 @@ Current logic on running scheduled fact retrievers is intended to be executed in
```diff
const builder = new DefaultTechInsightsBuilder({
logger,
config,
database,
discovery,
logger: env.logger,
config: env.config,
database: env.database,
discovery: env.discovery,
- factRetrievers: [],
+ factRetrievers: process.env.MAIN_FACT_RETRIEVER_INSTANCE ? [myFactRetrieverRegistration] : [],
});
@@ -210,14 +207,14 @@ and modify the `techInsights.ts` file to contain a reference to the FactChecker
+const myFactCheckerFactory = new JsonRulesEngineFactCheckerFactory({
+ checks: [],
+ logger,
+ logger: env.logger,
+}),
const builder = new DefaultTechInsightsBuilder({
logger,
config,
database,
discovery,
logger: env.logger,
config: env.config,
database: env.database,
discovery: env.discovery,
factRetrievers: [myFactRetrieverRegistration],
+ factCheckerFactory: myFactCheckerFactory
});
@@ -233,7 +230,7 @@ The default FactChecker implementation comes with an in-memory storage to store
const myTechInsightCheckRegistry: TechInsightCheckRegistry<MyCheckType> = // snip
const myFactCheckerFactory = new JsonRulesEngineFactCheckerFactory({
checks: [],
logger,
logger: env.logger,
+ checkRegistry: myTechInsightCheckRegistry
}),
+14 -13
View File
@@ -16,17 +16,18 @@ import {
} from '@backstage/plugin-todo-backend';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
reader,
config,
discovery,
}: PluginEnvironment): Promise<Router> {
const todoReader = TodoScmReader.fromConfig(config, {
logger,
reader,
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const todoReader = TodoScmReader.fromConfig(env.config, {
logger: env.logger,
reader: env.reader,
});
const catalogClient = new CatalogClient({ discoveryApi: discovery });
const catalogClient = new CatalogClient({
discoveryApi: discovery,
});
const todoService = new TodoReaderService({
todoReader,
catalogClient,
@@ -66,9 +67,9 @@ import {
// ...
const todoReader = TodoScmReader.fromConfig(config, {
logger,
reader,
const todoReader = TodoScmReader.fromConfig(env.config, {
logger: env.logger,
reader: env.reader,
parser: createTodoParser({
additionalTags: ['NOTE', 'XXX'],
}),
+11 -10
View File
@@ -26,17 +26,18 @@ import {
} from '@backstage/plugin-todo-backend';
import { PluginEnvironment } from '../types';
export default async function createPlugin({
logger,
reader,
config,
discovery,
}: PluginEnvironment): Promise<Router> {
const todoReader = TodoScmReader.fromConfig(config, {
logger,
reader,
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const todoReader = TodoScmReader.fromConfig(env.config, {
logger: env.logger,
reader: env.reader,
});
const catalogClient = new CatalogClient({ discoveryApi: discovery });
const catalogClient = new CatalogClient({
discoveryApi: env.discovery,
});
const todoService = new TodoReaderService({
todoReader,
catalogClient,