diff --git a/packages/backend-common/src/reading/UrlReaders.ts b/packages/backend-common/src/reading/UrlReaders.ts index 89bd672ce7..e1d99a2c49 100644 --- a/packages/backend-common/src/reading/UrlReaders.ts +++ b/packages/backend-common/src/reading/UrlReaders.ts @@ -24,48 +24,34 @@ import { GithubUrlReader } from './GithubUrlReader'; import { GitlabUrlReader } from './GitlabUrlReader'; import { FetchUrlReader } from './FetchUrlReader'; +type CreateOptions = { + /** Root config object */ + config: Config; + /** Logger used by all the readers */ + logger: Logger; + /** A list of factories used to construct individual readers that match on URLs */ + factories?: ReaderFactory[]; + /** Fallback reader to use if none of the readers created by the factories match */ + fallback?: UrlReader; +}; + /** * UrlReaders provide various utilities related to the UrlReader interface. */ export class UrlReaders { /** - * Creates a new UrlReaders instance without any known types. + * Creates a UrlReader without any known types. */ - static empty({ logger }: { logger: Logger }) { - return new UrlReaders([], logger); - } + static create({ + logger, + config, + factories, + fallback, + }: CreateOptions): UrlReader { + const mux = new UrlReaderPredicateMux({ fallback: fallback }); - /** - * Creates a new UrlReaders instance that includes all the default factories from this package - */ - static default({ logger }: { logger: Logger }) { - return new UrlReaders( - [ - AzureUrlReader.factory, - BitbucketUrlReader.factory, - GithubUrlReader.factory, - GitlabUrlReader.factory, - ], - logger, - new FetchUrlReader(), - ); - } - - private constructor( - private readonly factories: ReaderFactory[], - private readonly logger: Logger, - private fallback?: UrlReader, - ) {} - - /** - * Constructs a new UrlReader using the provided configuration. Any encountered - * reader type needs to have a registered factory, or an error will be thrown. - */ - createWithConfig(config: Config): UrlReader { - const mux = new UrlReaderPredicateMux({ fallback: this.fallback }); - - for (const factory of this.factories) { - const tuples = factory({ config, logger: this.logger }); + for (const factory of factories ?? []) { + const tuples = factory({ config, logger: logger }); for (const tuple of tuples) { mux.register(tuple); @@ -76,13 +62,23 @@ export class UrlReaders { } /** - * Register a UrlReader factory + * Creates a UrlReader that includes all the default factories from this package. + * + * Any additional factories passed will be loaded before the default ones. + * + * If no fallback reader is passed, a plain fetch reader will be used. */ - addFactory(factory: ReaderFactory) { - this.factories.push(factory); - } - - setFallback(reader?: UrlReader) { - this.fallback = reader; + static default({ logger, config, factories = [], fallback }: CreateOptions) { + return UrlReaders.create({ + logger, + config, + factories: factories.concat([ + AzureUrlReader.factory, + BitbucketUrlReader.factory, + GithubUrlReader.factory, + GitlabUrlReader.factory, + ]), + fallback: fallback ?? new FetchUrlReader(), + }); } } diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index ccaedb2830..959af71427 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -51,7 +51,7 @@ import { PluginEnvironment } from './types'; function makeCreateEnv(loadedConfigs: AppConfig[]) { const config = ConfigReader.fromConfigs(loadedConfigs); const root = getRootLogger(); - const reader = UrlReaders.default({ logger: root }).createWithConfig(config); + const reader = UrlReaders.default({ logger: root, config }); const discovery = SingleHostDiscovery.fromConfig(config); root.info(`Created UrlReader ${reader}`); diff --git a/packages/create-app/templates/default-app/packages/backend/src/index.ts b/packages/create-app/templates/default-app/packages/backend/src/index.ts index a87be04d78..684db8aab8 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/index.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/index.ts @@ -29,7 +29,7 @@ import { PluginEnvironment } from './types'; function makeCreateEnv(loadedConfigs: AppConfig[]) { const config = ConfigReader.fromConfigs(loadedConfigs); const root = getRootLogger(); - const reader = UrlReaders.default({ logger: root }).createWithConfig(config); + const reader = UrlReaders.default({ logger: root, config }); const discovery = SingleHostDiscovery.fromConfig(config); root.info(`Created UrlReader ${reader}`); diff --git a/plugins/catalog-backend/src/ingestion/processors/UrlReaderProcessor.test.ts b/plugins/catalog-backend/src/ingestion/processors/UrlReaderProcessor.test.ts index e8ee32e765..009872cda3 100644 --- a/plugins/catalog-backend/src/ingestion/processors/UrlReaderProcessor.test.ts +++ b/plugins/catalog-backend/src/ingestion/processors/UrlReaderProcessor.test.ts @@ -35,9 +35,7 @@ describe('UrlReaderProcessor', () => { it('should load from url', async () => { const logger = getVoidLogger(); - const reader = UrlReaders.default({ logger }).createWithConfig( - new ConfigReader({}), - ); + const reader = UrlReaders.default({ logger, config: new ConfigReader({}) }); const processor = new UrlReaderProcessor({ reader, logger }); const spec = { type: 'url', @@ -61,9 +59,7 @@ describe('UrlReaderProcessor', () => { it('should fail load from url with error', async () => { const logger = getVoidLogger(); - const reader = UrlReaders.default({ logger }).createWithConfig( - new ConfigReader({}), - ); + const reader = UrlReaders.default({ logger, config: new ConfigReader({}) }); const processor = new UrlReaderProcessor({ reader, logger }); const spec = { type: 'url', diff --git a/plugins/catalog-backend/src/service/standaloneServer.ts b/plugins/catalog-backend/src/service/standaloneServer.ts index 8ee01bb67f..5939c7eb58 100644 --- a/plugins/catalog-backend/src/service/standaloneServer.ts +++ b/plugins/catalog-backend/src/service/standaloneServer.ts @@ -40,7 +40,7 @@ export async function startStandaloneServer( ): Promise { const logger = options.logger.child({ service: 'catalog-backend' }); const config = ConfigReader.fromConfigs(await loadBackendConfig()); - const reader = UrlReaders.default({ logger }).createWithConfig(config); + const reader = UrlReaders.default({ logger, config }); logger.debug('Creating application...'); const db = await DatabaseManager.createInMemoryDatabase({ logger });