Merge branch 'master' of github.com:backstage/backstage into blam/isomorphic-git

* 'master' of github.com:backstage/backstage: (45 commits)
  Speed up some PRs with paths-ignore
  Remove unnecessary step
  catalog: export EntitySwitch component and conditions
  Apply suggestions from code review
  changeset: add changeset for new catalog composability components
  catalog: fix EntityLayout TabbedLayout route path matching
  catalog: gather all mount points beneath EntityLayout Routes
  catalog: add EntityLayout
  Change to raw Windows Discord hook
  Release plugin-cost-insights 0.5.3
  catalog: add EntitySwitch
  catalog: export new CatalogIndexPage and CatalogEntityPage
  Create dull-seals-march.md
  core-api: add BackstageRoutes
  Fix plugin name
  fixed category lables
  feat(cost-insights): Make alert url field optional
  fossa: Add changeset
  fix(fossa): Bump core packages version to fix failing CI
  Update 2020-12-22-stability-index.md
  ...
This commit is contained in:
blam
2020-12-26 22:22:11 +01:00
142 changed files with 3149 additions and 399 deletions
+39
View File
@@ -1,5 +1,44 @@
# @backstage/techdocs-common
## 0.3.0
### Minor Changes
- a8573e53b: techdocs-backend: Simplified file, removing individual preparers and generators.
techdocs-backend: UrlReader is now available to use in preparers.
In your Backstage app, `packages/backend/plugins/techdocs.ts` file has now been simplified,
to remove registering individual preparers and generators.
Please update the file when upgrading the version of `@backstage/plugin-techdocs-backend` package.
```typescript
const preparers = await Preparers.fromConfig(config, {
logger,
reader,
});
const generators = await Generators.fromConfig(config, {
logger,
});
const publisher = await Publisher.fromConfig(config, {
logger,
discovery,
});
```
You should be able to remove unnecessary imports, and just do
```typescript
import {
createRouter,
Preparers,
Generators,
Publisher,
} from '@backstage/plugin-techdocs-backend';
```
## 0.2.0
### Minor Changes
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/techdocs-common",
"description": "Common functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli",
"version": "0.2.0",
"version": "0.3.0",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -54,7 +54,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.4.2",
"@backstage/cli": "^0.4.3",
"@types/fs-extra": "^9.0.5",
"@types/git-url-parse": "^9.0.0",
"@types/js-yaml": "^3.12.5",
@@ -14,18 +14,32 @@
* limitations under the License.
*/
import { Logger } from 'winston';
import { Entity } from '@backstage/catalog-model';
import { Config } from '@backstage/config';
import { TechdocsGenerator } from '.';
import {
GeneratorBase,
SupportedGeneratorKey,
GeneratorBuilder,
} from './types';
import { Entity } from '@backstage/catalog-model';
import { getGeneratorKey } from './helpers';
export class Generators implements GeneratorBuilder {
private generatorMap = new Map<SupportedGeneratorKey, GeneratorBase>();
static async fromConfig(
config: Config,
{ logger }: { logger: Logger },
): Promise<GeneratorBuilder> {
const generators = new Generators();
const techdocsGenerator = new TechdocsGenerator(logger, config);
generators.register('techdocs', techdocsGenerator);
return generators;
}
register(generatorKey: SupportedGeneratorKey, generator: GeneratorBase) {
this.generatorMap.set(generatorKey, generator);
}
@@ -13,14 +13,45 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { PreparerBase, RemoteProtocol, PreparerBuilder } from './types';
import { Logger } from 'winston';
import { UrlReader } from '@backstage/backend-common';
import { Entity } from '@backstage/catalog-model';
import { Config } from '@backstage/config';
import { DirectoryPreparer, CommonGitPreparer, UrlPreparer } from '.';
import { PreparerBase, RemoteProtocol, PreparerBuilder } from './types';
import { parseReferenceAnnotation } from '../../helpers';
type factoryOptions = {
logger: Logger;
reader: UrlReader;
};
export class Preparers implements PreparerBuilder {
private preparerMap = new Map<RemoteProtocol, PreparerBase>();
static async fromConfig(
// @ts-ignore
// Config not used now, but will be used in urlPreparer when it starts using
// @backstage/integration to get the tokens for providers.
config: Config,
{ logger, reader }: factoryOptions,
): Promise<PreparerBuilder> {
const preparers = new Preparers();
const directoryPreparer = new DirectoryPreparer(logger);
preparers.register('dir', directoryPreparer);
const commonGitPreparer = new CommonGitPreparer(logger);
preparers.register('github', commonGitPreparer);
preparers.register('gitlab', commonGitPreparer);
preparers.register('azure/api', commonGitPreparer);
const urlPreparer = new UrlPreparer(reader, logger);
preparers.register('url', urlPreparer);
return preparers;
}
register(protocol: RemoteProtocol, preparer: PreparerBase) {
this.preparerMap.set(protocol, preparer);
}
@@ -23,24 +23,27 @@ import { LocalPublish } from './local';
import { GoogleGCSPublish } from './googleStorage';
const logger = getVoidLogger();
const testDiscovery: jest.Mocked<PluginEndpointDiscovery> = {
const discovery: jest.Mocked<PluginEndpointDiscovery> = {
getBaseUrl: jest.fn().mockResolvedValueOnce('http://localhost:7000'),
getExternalBaseUrl: jest.fn(),
};
describe('Publisher', () => {
it('should create local publisher by default', () => {
it('should create local publisher by default', async () => {
const mockConfig = new ConfigReader({
techdocs: {
requestUrl: 'http://localhost:7000',
},
});
const publisher = Publisher.fromConfig(mockConfig, logger, testDiscovery);
const publisher = await Publisher.fromConfig(mockConfig, {
logger,
discovery,
});
expect(publisher).toBeInstanceOf(LocalPublish);
});
it('should create local publisher from config', () => {
it('should create local publisher from config', async () => {
const mockConfig = new ConfigReader({
techdocs: {
requestUrl: 'http://localhost:7000',
@@ -50,11 +53,14 @@ describe('Publisher', () => {
},
});
const publisher = Publisher.fromConfig(mockConfig, logger, testDiscovery);
const publisher = await Publisher.fromConfig(mockConfig, {
logger,
discovery,
});
expect(publisher).toBeInstanceOf(LocalPublish);
});
it('should create google gcs publisher from config', () => {
it('should create google gcs publisher from config', async () => {
const mockConfig = new ConfigReader({
techdocs: {
requestUrl: 'http://localhost:7000',
@@ -69,7 +75,10 @@ describe('Publisher', () => {
},
});
const publisher = Publisher.fromConfig(mockConfig, logger, testDiscovery);
const publisher = await Publisher.fromConfig(mockConfig, {
logger,
discovery,
});
expect(publisher).toBeInstanceOf(GoogleGCSPublish);
});
});
@@ -21,16 +21,20 @@ import { PublisherType, PublisherBase } from './types';
import { LocalPublish } from './local';
import { GoogleGCSPublish } from './googleStorage';
type factoryOptions = {
logger: Logger;
discovery: PluginEndpointDiscovery;
};
/**
* Factory class to create a TechDocs publisher based on defined publisher type in app config.
* Uses `techdocs.publisher.type`.
*/
export class Publisher {
static fromConfig(
static async fromConfig(
config: Config,
logger: Logger,
discovery: PluginEndpointDiscovery,
): PublisherBase {
{ logger, discovery }: factoryOptions,
): Promise<PublisherBase> {
const publisherType = (config.getOptionalString(
'techdocs.publisher.type',
) ?? 'local') as PublisherType;