diff --git a/.changeset/typescript-constructor-refactor.md b/.changeset/typescript-constructor-refactor.md new file mode 100644 index 0000000000..b24cb5dbd0 --- /dev/null +++ b/.changeset/typescript-constructor-refactor.md @@ -0,0 +1,63 @@ +--- +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-kubernetes-react': patch +'@backstage/plugin-notifications-backend': patch +'@backstage/plugin-notifications-node': patch +'@backstage/plugin-permission-react': patch +'@backstage/plugin-scaffolder-backend-module-gcp': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-search-backend-module-elasticsearch': patch +'@backstage/plugin-search-backend-module-pg': patch +'@backstage/plugin-search-backend': patch +'@backstage/plugin-search-backend-node': patch +'@backstage/plugin-search-react': patch +'@backstage/plugin-signals': patch +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-events-backend': patch +'@backstage/plugin-catalog-backend-module-backstage-openapi': patch +'@backstage/plugin-events-node': patch +'@backstage/plugin-user-settings': patch +'@backstage/plugin-auth-backend': patch +'@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch +'@backstage/plugin-catalog-react': patch +'@backstage/plugin-notifications-backend-module-email': patch +'@backstage/plugin-events-backend-module-aws-sqs': patch +'@backstage/plugin-devtools-backend': patch +'@backstage/plugin-catalog-backend-module-unprocessed': patch +'@backstage/plugin-catalog-backend-module-azure': patch +'@backstage/plugin-catalog-backend-module-aws': patch +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-techdocs-node': patch +'@backstage/plugin-catalog-unprocessed-entities': patch +'@backstage/plugin-catalog-backend-module-msgraph': patch +'@backstage/plugin-catalog-backend-module-ldap': patch +'@backstage/plugin-bitbucket-cloud-common': patch +'@backstage/plugin-auth-node': patch +'@backstage/backend-app-api': patch +'@backstage/backend-defaults': patch +'@backstage/config-loader': patch +'@backstage/core-app-api': patch +'@backstage/core-plugin-api': patch +'@backstage/frontend-app-api': patch +'@backstage/config': patch +'@backstage/backend-dynamic-feature-service': patch +'@backstage/core-components': patch +'@backstage/cli': patch +'@backstage/cli-node': patch +'@backstage/catalog-model': patch +'@backstage/integration': patch +'@backstage/frontend-plugin-api': patch +'@backstage/integration-aws-node': patch +'@backstage/repo-tools': patch +'@backstage/backend-test-utils': patch +'@backstage/plugin-catalog-import': patch +'@backstage/plugin-events-backend-module-kafka': patch +'@backstage/plugin-kubernetes-node': patch +'@backstage/plugin-mcp-actions-backend': patch +'@backstage/plugin-scaffolder-node-test-utils': patch +'@backstage/plugin-scaffolder-node': patch +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-user-settings-backend': patch +--- + +Refactored constructor parameter properties to explicit property declarations for compatibility with TypeScript's `erasableSyntaxOnly` setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility. diff --git a/packages/app/src/AuthProxyDiscoveryApi.ts b/packages/app/src/AuthProxyDiscoveryApi.ts index 761803f0de..23d6e404db 100644 --- a/packages/app/src/AuthProxyDiscoveryApi.ts +++ b/packages/app/src/AuthProxyDiscoveryApi.ts @@ -20,12 +20,16 @@ import { DiscoveryApi } from '@backstage/core-plugin-api'; export class AuthProxyDiscoveryApi implements DiscoveryApi { private urlPatternDiscovery: UrlPatternDiscovery; + private readonly isAuthProxyingEnabled?: boolean; + private readonly authProxyUrl?: string; constructor( baseUrl: string, - private readonly isAuthProxyingEnabled?: boolean, - private readonly authProxyUrl?: string, + isAuthProxyingEnabled?: boolean, + authProxyUrl?: string, ) { + this.isAuthProxyingEnabled = isAuthProxyingEnabled; + this.authProxyUrl = authProxyUrl; this.urlPatternDiscovery = UrlPatternDiscovery.compile( `${baseUrl}/api/{{ pluginId }}`, ); diff --git a/packages/backend-app-api/src/lib/DependencyGraph.ts b/packages/backend-app-api/src/lib/DependencyGraph.ts index 8b3de48ff2..8e36c39aec 100644 --- a/packages/backend-app-api/src/lib/DependencyGraph.ts +++ b/packages/backend-app-api/src/lib/DependencyGraph.ts @@ -30,11 +30,15 @@ class Node { ); } - private constructor( - readonly value: T, - readonly consumes: Set, - readonly provides: Set, - ) {} + readonly value: T; + readonly consumes: Set; + readonly provides: Set; + + private constructor(value: T, consumes: Set, provides: Set) { + this.value = value; + this.consumes = consumes; + this.provides = provides; + } } /** @internal */ diff --git a/packages/backend-defaults/src/PackageDiscoveryService.ts b/packages/backend-defaults/src/PackageDiscoveryService.ts index abf015baf3..e4c7b3ab3b 100644 --- a/packages/backend-defaults/src/PackageDiscoveryService.ts +++ b/packages/backend-defaults/src/PackageDiscoveryService.ts @@ -80,10 +80,13 @@ async function findClosestPackageDir( /** @internal */ export class PackageDiscoveryService { - constructor( - private readonly config: RootConfigService, - private readonly logger: RootLoggerService, - ) {} + private readonly config: RootConfigService; + private readonly logger: RootLoggerService; + + constructor(config: RootConfigService, logger: RootLoggerService) { + this.config = config; + this.logger = logger; + } getDependencyNames(path: string) { const { dependencies } = require(path) as BackstagePackageJson; diff --git a/packages/backend-defaults/src/alpha/entrypoints/actions/DefaultActionsService.ts b/packages/backend-defaults/src/alpha/entrypoints/actions/DefaultActionsService.ts index d8847c2187..155bbf8b35 100644 --- a/packages/backend-defaults/src/alpha/entrypoints/actions/DefaultActionsService.ts +++ b/packages/backend-defaults/src/alpha/entrypoints/actions/DefaultActionsService.ts @@ -28,12 +28,22 @@ import { } from '@backstage/backend-plugin-api/alpha'; export class DefaultActionsService implements ActionsService { + private readonly discovery: DiscoveryService; + private readonly config: RootConfigService; + private readonly logger: LoggerService; + private readonly auth: AuthService; + private constructor( - private readonly discovery: DiscoveryService, - private readonly config: RootConfigService, - private readonly logger: LoggerService, - private readonly auth: AuthService, - ) {} + discovery: DiscoveryService, + config: RootConfigService, + logger: LoggerService, + auth: AuthService, + ) { + this.discovery = discovery; + this.config = config; + this.logger = logger; + this.auth = auth; + } static create({ discovery, diff --git a/packages/backend-defaults/src/alpha/entrypoints/actionsRegistry/DefaultActionsRegistryService.ts b/packages/backend-defaults/src/alpha/entrypoints/actionsRegistry/DefaultActionsRegistryService.ts index 2284935787..7348e0a185 100644 --- a/packages/backend-defaults/src/alpha/entrypoints/actionsRegistry/DefaultActionsRegistryService.ts +++ b/packages/backend-defaults/src/alpha/entrypoints/actionsRegistry/DefaultActionsRegistryService.ts @@ -39,12 +39,22 @@ export class DefaultActionsRegistryService implements ActionsRegistryService { private actions: Map> = new Map(); + private readonly logger: LoggerService; + private readonly httpAuth: HttpAuthService; + private readonly auth: AuthService; + private readonly metadata: PluginMetadataService; + private constructor( - private readonly logger: LoggerService, - private readonly httpAuth: HttpAuthService, - private readonly auth: AuthService, - private readonly metadata: PluginMetadataService, - ) {} + logger: LoggerService, + httpAuth: HttpAuthService, + auth: AuthService, + metadata: PluginMetadataService, + ) { + this.logger = logger; + this.httpAuth = httpAuth; + this.auth = auth; + this.metadata = metadata; + } static create({ httpAuth, diff --git a/packages/backend-defaults/src/entrypoints/auditor/WinstonRootAuditorService.ts b/packages/backend-defaults/src/entrypoints/auditor/WinstonRootAuditorService.ts index 67a28cf74b..32c21e642e 100644 --- a/packages/backend-defaults/src/entrypoints/auditor/WinstonRootAuditorService.ts +++ b/packages/backend-defaults/src/entrypoints/auditor/WinstonRootAuditorService.ts @@ -81,7 +81,11 @@ export type WinstonRootAuditorServiceOptions = { * ``` */ export class WinstonRootAuditorService { - private constructor(private readonly winstonLogger: WinstonLogger) {} + private readonly winstonLogger: WinstonLogger; + + private constructor(winstonLogger: WinstonLogger) { + this.winstonLogger = winstonLogger; + } /** * Creates a {@link WinstonRootAuditorService} instance. diff --git a/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts b/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts index dba4f70dec..bee40de65e 100644 --- a/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts +++ b/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts @@ -38,14 +38,28 @@ import { UserTokenHandler } from './user/UserTokenHandler'; /** @internal */ export class DefaultAuthService implements AuthService { + private readonly userTokenHandler: UserTokenHandler; + private readonly pluginTokenHandler: PluginTokenHandler; + private readonly externalTokenHandler: ExternalAuthTokenHandler; + private readonly pluginId: string; + private readonly disableDefaultAuthPolicy: boolean; + private readonly pluginKeySource: PluginKeySource; + constructor( - private readonly userTokenHandler: UserTokenHandler, - private readonly pluginTokenHandler: PluginTokenHandler, - private readonly externalTokenHandler: ExternalAuthTokenHandler, - private readonly pluginId: string, - private readonly disableDefaultAuthPolicy: boolean, - private readonly pluginKeySource: PluginKeySource, - ) {} + userTokenHandler: UserTokenHandler, + pluginTokenHandler: PluginTokenHandler, + externalTokenHandler: ExternalAuthTokenHandler, + pluginId: string, + disableDefaultAuthPolicy: boolean, + pluginKeySource: PluginKeySource, + ) { + this.userTokenHandler = userTokenHandler; + this.pluginTokenHandler = pluginTokenHandler; + this.externalTokenHandler = externalTokenHandler; + this.pluginId = pluginId; + this.disableDefaultAuthPolicy = disableDefaultAuthPolicy; + this.pluginKeySource = pluginKeySource; + } async authenticate( token: string, diff --git a/packages/backend-defaults/src/entrypoints/auth/JwksClient.ts b/packages/backend-defaults/src/entrypoints/auth/JwksClient.ts index f956ceb70a..cd283fe92b 100644 --- a/packages/backend-defaults/src/entrypoints/auth/JwksClient.ts +++ b/packages/backend-defaults/src/entrypoints/auth/JwksClient.ts @@ -30,7 +30,11 @@ export class JwksClient { #keyStore?: GetKeyFunction; #keyStoreUpdated: number = 0; - constructor(private readonly getEndpoint: () => Promise) {} + private readonly getEndpoint: () => Promise; + + constructor(getEndpoint: () => Promise) { + this.getEndpoint = getEndpoint; + } get getKey() { if (!this.#keyStore) { diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts index e3f1acf270..50cfb47b3e 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts @@ -38,13 +38,14 @@ interface AnyJWK extends Record { } class FakeTokenFactory { private readonly keys = new Array(); + private readonly options: { + issuer: string; + keyDurationSeconds: number; + }; - constructor( - private readonly options: { - issuer: string; - keyDurationSeconds: number; - }, - ) {} + constructor(options: { issuer: string; keyDurationSeconds: number }) { + this.options = options; + } async issueToken(params: { claims: { diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts index 21b3aed99d..e0a7680ce5 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts @@ -140,14 +140,24 @@ export class ExternalAuthTokenHandler { return new ExternalAuthTokenHandler(ownPluginId, contexts); } + private readonly ownPluginId: string; + private readonly contexts: { + context: unknown; + handler: ExternalTokenHandler; + allAccessRestrictions?: AccessRestrictionsMap; + }[]; + constructor( - private readonly ownPluginId: string, - private readonly contexts: { + ownPluginId: string, + contexts: { context: unknown; handler: ExternalTokenHandler; allAccessRestrictions?: AccessRestrictionsMap; }[], - ) {} + ) { + this.ownPluginId = ownPluginId; + this.contexts = contexts; + } async verifyToken(token: string): Promise< | { diff --git a/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts index 778e5090bf..327173fdee 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts @@ -31,13 +31,14 @@ interface AnyJWK extends Record { } class FakeTokenFactory { private readonly keys = new Array(); + private readonly options: { + issuer: string; + keyDurationSeconds: number; + }; - constructor( - private readonly options: { - issuer: string; - keyDurationSeconds: number; - }, - ) {} + constructor(options: { issuer: string; keyDurationSeconds: number }) { + this.options = options; + } async issueToken(params: { claims: { diff --git a/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts index b692cd2b87..2bd797c929 100644 --- a/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts +++ b/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts @@ -77,14 +77,28 @@ export class DefaultPluginTokenHandler implements PluginTokenHandler { ); } + private readonly logger: LoggerService; + private readonly ownPluginId: string; + private readonly keySource: PluginKeySource; + private readonly algorithm: string; + private readonly keyDurationSeconds: number; + private readonly discovery: DiscoveryService; + private constructor( - private readonly logger: LoggerService, - private readonly ownPluginId: string, - private readonly keySource: PluginKeySource, - private readonly algorithm: string, - private readonly keyDurationSeconds: number, - private readonly discovery: DiscoveryService, - ) {} + logger: LoggerService, + ownPluginId: string, + keySource: PluginKeySource, + algorithm: string, + keyDurationSeconds: number, + discovery: DiscoveryService, + ) { + this.logger = logger; + this.ownPluginId = ownPluginId; + this.keySource = keySource; + this.algorithm = algorithm; + this.keyDurationSeconds = keyDurationSeconds; + this.discovery = discovery; + } async verifyToken( token: string, diff --git a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabaseKeyStore.ts b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabaseKeyStore.ts index 9f5c278a9c..c34da745d1 100644 --- a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabaseKeyStore.ts +++ b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabaseKeyStore.ts @@ -62,10 +62,13 @@ export class DatabaseKeyStore implements KeyStore { return new DatabaseKeyStore(client, logger); } - private constructor( - private readonly client: Knex, - private readonly logger: LoggerService, - ) {} + private readonly client: Knex; + private readonly logger: LoggerService; + + private constructor(client: Knex, logger: LoggerService) { + this.client = client; + this.logger = logger; + } async addKey(options: { id: string; diff --git a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts index 37cb1aeb5c..e6a7bbcfc6 100644 --- a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts +++ b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/DatabasePluginKeySource.ts @@ -33,13 +33,22 @@ const KEY_EXPIRATION_MARGIN_FACTOR = 3; export class DatabasePluginKeySource implements PluginKeySource { private privateKeyPromise?: Promise; private keyExpiry?: Date; + private readonly keyStore: KeyStore; + private readonly logger: LoggerService; + private readonly keyDurationSeconds: number; + private readonly algorithm: string; constructor( - private readonly keyStore: KeyStore, - private readonly logger: LoggerService, - private readonly keyDurationSeconds: number, - private readonly algorithm: string, - ) {} + keyStore: KeyStore, + logger: LoggerService, + keyDurationSeconds: number, + algorithm: string, + ) { + this.keyStore = keyStore; + this.logger = logger; + this.keyDurationSeconds = keyDurationSeconds; + this.algorithm = algorithm; + } public static async create(options: { logger: LoggerService; diff --git a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.ts b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.ts index eb863a807a..504f608d8d 100644 --- a/packages/backend-defaults/src/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.ts +++ b/packages/backend-defaults/src/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.ts @@ -67,10 +67,13 @@ const SECONDS_IN_MS = 1000; * private and public key paths in the `create` method. */ export class StaticConfigPluginKeySource implements PluginKeySource { - private constructor( - private readonly keyPairs: KeyPair[], - private readonly keyDurationSeconds: number, - ) {} + private readonly keyPairs: KeyPair[]; + private readonly keyDurationSeconds: number; + + private constructor(keyPairs: KeyPair[], keyDurationSeconds: number) { + this.keyPairs = keyPairs; + this.keyDurationSeconds = keyDurationSeconds; + } public static async create(options: { sourceConfig: Config; diff --git a/packages/backend-defaults/src/entrypoints/auth/user/UserTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/user/UserTokenHandler.ts index d205fa6b82..a1b8654527 100644 --- a/packages/backend-defaults/src/entrypoints/auth/user/UserTokenHandler.ts +++ b/packages/backend-defaults/src/entrypoints/auth/user/UserTokenHandler.ts @@ -44,10 +44,13 @@ export class UserTokenHandler { return new UserTokenHandler(jwksClient, options.logger); } - constructor( - private readonly jwksClient: JwksClient, - private readonly logger: LoggerService, - ) {} + private readonly jwksClient: JwksClient; + private readonly logger: LoggerService; + + constructor(jwksClient: JwksClient, logger: LoggerService) { + this.jwksClient = jwksClient; + this.logger = logger; + } async verifyToken(token: string) { const verifyOpts = this.#getTokenVerificationOptions(token); diff --git a/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts b/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts index 5ca70cab86..96313e50af 100644 --- a/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts +++ b/packages/backend-defaults/src/entrypoints/database/DatabaseManager.ts @@ -52,16 +52,24 @@ export type DatabaseManagerOptions = { * Testable implementation class for {@link DatabaseManager} below. */ export class DatabaseManagerImpl { + private readonly config: Config; + private readonly connectors: Record; + private readonly options?: DatabaseManagerOptions; + private readonly databaseCache: Map>; + private readonly keepaliveIntervals: Map; + constructor( - private readonly config: Config, - private readonly connectors: Record, - private readonly options?: DatabaseManagerOptions, - private readonly databaseCache: Map> = new Map(), - private readonly keepaliveIntervals: Map< - string, - NodeJS.Timeout - > = new Map(), + config: Config, + connectors: Record, + options?: DatabaseManagerOptions, + databaseCache: Map> = new Map(), + keepaliveIntervals: Map = new Map(), ) { + this.config = config; + this.connectors = connectors; + this.options = options; + this.databaseCache = databaseCache; + this.keepaliveIntervals = keepaliveIntervals; // If a rootLifecycle service was provided, register a shutdown hook to // clean up any database connections. if (options?.rootLifecycle !== undefined) { @@ -262,7 +270,11 @@ export class DatabaseManager { ); } - private constructor(private readonly impl: DatabaseManagerImpl) {} + private readonly impl: DatabaseManagerImpl; + + private constructor(impl: DatabaseManagerImpl) { + this.impl = impl; + } /** * Generates a DatabaseService for consumption by plugins. diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/mysql.ts b/packages/backend-defaults/src/entrypoints/database/connectors/mysql.ts index d5bd88deef..e44feed361 100644 --- a/packages/backend-defaults/src/entrypoints/database/connectors/mysql.ts +++ b/packages/backend-defaults/src/entrypoints/database/connectors/mysql.ts @@ -243,10 +243,13 @@ function normalizeConnection( } export class MysqlConnector implements Connector { - constructor( - private readonly config: Config, - private readonly prefix: string, - ) {} + private readonly config: Config; + private readonly prefix: string; + + constructor(config: Config, prefix: string) { + this.config = config; + this.prefix = prefix; + } async getClient( pluginId: string, diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts index 4adf77a2f6..4a6893e9c1 100644 --- a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts +++ b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts @@ -294,10 +294,13 @@ function normalizeConnection( } export class PgConnector implements Connector { - constructor( - private readonly config: Config, - private readonly prefix: string, - ) {} + private readonly config: Config; + private readonly prefix: string; + + constructor(config: Config, prefix: string) { + this.config = config; + this.prefix = prefix; + } async getClient( pluginId: string, diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/sqlite3.ts b/packages/backend-defaults/src/entrypoints/database/connectors/sqlite3.ts index 67dd9d975f..081169c700 100644 --- a/packages/backend-defaults/src/entrypoints/database/connectors/sqlite3.ts +++ b/packages/backend-defaults/src/entrypoints/database/connectors/sqlite3.ts @@ -174,7 +174,11 @@ function normalizeConnection( } export class Sqlite3Connector implements Connector { - constructor(private readonly config: Config) {} + private readonly config: Config; + + constructor(config: Config) { + this.config = config; + } async getClient( pluginId: string, diff --git a/packages/backend-defaults/src/entrypoints/lifecycle/lifecycleServiceFactory.ts b/packages/backend-defaults/src/entrypoints/lifecycle/lifecycleServiceFactory.ts index 0ba812f5b4..92c4f599a4 100644 --- a/packages/backend-defaults/src/entrypoints/lifecycle/lifecycleServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/lifecycle/lifecycleServiceFactory.ts @@ -28,10 +28,13 @@ import { /** @internal */ export class BackendPluginLifecycleImpl implements LifecycleService { - constructor( - private readonly logger: LoggerService, - private readonly pluginMetadata: PluginMetadataService, - ) {} + private readonly logger: LoggerService; + private readonly pluginMetadata: PluginMetadataService; + + constructor(logger: LoggerService, pluginMetadata: PluginMetadataService) { + this.logger = logger; + this.pluginMetadata = pluginMetadata; + } #hasStarted = false; #hasShutdown = false; diff --git a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts index b201079b4f..e7255610bc 100644 --- a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts @@ -24,8 +24,10 @@ import { /** @internal */ export class DefaultRootHealthService implements RootHealthService { #state: 'init' | 'up' | 'down' = 'init'; + readonly options: { lifecycle: RootLifecycleService }; - constructor(readonly options: { lifecycle: RootLifecycleService }) { + constructor(options: { lifecycle: RootLifecycleService }) { + this.options = options; options.lifecycle.addStartupHook(() => { this.#state = 'up'; }); diff --git a/packages/backend-defaults/src/entrypoints/rootLifecycle/rootLifecycleServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootLifecycle/rootLifecycleServiceFactory.ts index abba4beece..a77a2e1308 100644 --- a/packages/backend-defaults/src/entrypoints/rootLifecycle/rootLifecycleServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/rootLifecycle/rootLifecycleServiceFactory.ts @@ -27,7 +27,11 @@ import { /** @internal */ export class BackendLifecycleImpl implements RootLifecycleService { - constructor(private readonly logger: LoggerService) {} + private readonly logger: LoggerService; + + constructor(logger: LoggerService) { + this.logger = logger; + } #hasStarted = false; #startupTasks: Array<{ diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/LocalTaskWorker.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/LocalTaskWorker.ts index a063f4145e..21fa75cae9 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/LocalTaskWorker.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/LocalTaskWorker.ts @@ -36,11 +36,19 @@ export class LocalTaskWorker { status: 'idle', }; + private readonly taskId: string; + private readonly fn: SchedulerServiceTaskFunction; + private readonly logger: LoggerService; + constructor( - private readonly taskId: string, - private readonly fn: SchedulerServiceTaskFunction, - private readonly logger: LoggerService, - ) {} + taskId: string, + fn: SchedulerServiceTaskFunction, + logger: LoggerService, + ) { + this.taskId = taskId; + this.fn = fn; + this.logger = logger; + } start(settings: TaskSettingsV2, options: { signal: AbortSignal }) { this.logger.info( diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.ts index b7a946ab80..90f5d08e4a 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.ts @@ -50,12 +50,19 @@ export class PluginTaskSchedulerImpl implements SchedulerService { private readonly lastStarted: Gauge; private readonly lastCompleted: Gauge; + private readonly pluginId: string; + private readonly databaseFactory: () => Promise; + private readonly logger: LoggerService; + constructor( - private readonly pluginId: string, - private readonly databaseFactory: () => Promise, - private readonly logger: LoggerService, + pluginId: string, + databaseFactory: () => Promise, + logger: LoggerService, rootLifecycle: RootLifecycleService, ) { + this.pluginId = pluginId; + this.databaseFactory = databaseFactory; + this.logger = logger; const meter = metrics.getMeter('default'); this.counter = meter.createCounter('backend_tasks.task.runs.count', { description: 'Total number of times a task has been run', diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts index 32e7a5ab4e..eebe1a149f 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskWorker.ts @@ -46,14 +46,25 @@ export class TaskWorker { #workerState: TaskApiTasksResponse['workerState'] = { status: 'idle', }; + private readonly taskId: string; + private readonly fn: SchedulerServiceTaskFunction; + private readonly knex: Knex; + private readonly logger: LoggerService; + private readonly workCheckFrequency: Duration; constructor( - private readonly taskId: string, - private readonly fn: SchedulerServiceTaskFunction, - private readonly knex: Knex, - private readonly logger: LoggerService, - private readonly workCheckFrequency: Duration = DEFAULT_WORK_CHECK_FREQUENCY, - ) {} + taskId: string, + fn: SchedulerServiceTaskFunction, + knex: Knex, + logger: LoggerService, + workCheckFrequency: Duration = DEFAULT_WORK_CHECK_FREQUENCY, + ) { + this.taskId = taskId; + this.fn = fn; + this.knex = knex; + this.logger = logger; + this.workCheckFrequency = workCheckFrequency; + } async start(settings: TaskSettingsV2, options: { signal: AbortSignal }) { try { diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.ts index 7cffe6a28b..06af036891 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.ts @@ -142,13 +142,23 @@ export class AwsCodeCommitUrlReader implements UrlReaderService { }); }; + private readonly credsManager: AwsCredentialsManager; + private readonly integration: AwsCodeCommitIntegration; + private readonly deps: { + treeResponseFactory: ReadTreeResponseFactory; + }; + constructor( - private readonly credsManager: AwsCredentialsManager, - private readonly integration: AwsCodeCommitIntegration, - private readonly deps: { + credsManager: AwsCredentialsManager, + integration: AwsCodeCommitIntegration, + deps: { treeResponseFactory: ReadTreeResponseFactory; }, - ) {} + ) { + this.credsManager = credsManager; + this.integration = integration; + this.deps = deps; + } /** * If accessKeyId and secretAccessKey are missing, the standard credentials provider chain will be used: diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsS3UrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsS3UrlReader.ts index 5060f6c632..87563a86ba 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsS3UrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AwsS3UrlReader.ts @@ -151,13 +151,23 @@ export class AwsS3UrlReader implements UrlReaderService { }); }; + private readonly credsManager: AwsCredentialsManager; + private readonly integration: AwsS3Integration; + private readonly deps: { + treeResponseFactory: ReadTreeResponseFactory; + }; + constructor( - private readonly credsManager: AwsCredentialsManager, - private readonly integration: AwsS3Integration, - private readonly deps: { + credsManager: AwsCredentialsManager, + integration: AwsS3Integration, + deps: { treeResponseFactory: ReadTreeResponseFactory; }, - ) {} + ) { + this.credsManager = credsManager; + this.integration = integration; + this.deps = deps; + } /** * If accessKeyId and secretAccessKey are missing, the standard credentials provider chain will be used: diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts index 1953beabe9..ca5f49405f 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts @@ -91,13 +91,23 @@ export class AzureBlobStorageUrlReader implements UrlReaderService { // private readonly blobServiceClient: BlobServiceClient; + private readonly credsManager: AzureCredentialsManager; + private readonly integration: AzureBlobStorageIntergation; + private readonly deps: { + treeResponseFactory: ReadTreeResponseFactory; + }; + constructor( - private readonly credsManager: AzureCredentialsManager, - private readonly integration: AzureBlobStorageIntergation, - private readonly deps: { + credsManager: AzureCredentialsManager, + integration: AzureBlobStorageIntergation, + deps: { treeResponseFactory: ReadTreeResponseFactory; }, - ) {} + ) { + this.credsManager = credsManager; + this.integration = integration; + this.deps = deps; + } private async createContainerClient( containerName: string, diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureUrlReader.test.ts index 12a7ae8093..ee0eac6b4e 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureUrlReader.test.ts @@ -214,7 +214,7 @@ describe('AzureUrlReader', () => { res( ctx.status(200), ctx.set('Content-Type', 'application/zip'), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get( @@ -324,7 +324,7 @@ describe('AzureUrlReader', () => { res( ctx.status(200), ctx.set('Content-Type', 'application/zip'), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get( diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureUrlReader.ts index 465ec2326c..66fd1cc95a 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureUrlReader.ts @@ -62,13 +62,22 @@ export class AzureUrlReader implements UrlReaderService { }); }; + private readonly integration: AzureIntegration; + private readonly deps: { + treeResponseFactory: ReadTreeResponseFactory; + credentialsProvider: AzureDevOpsCredentialsProvider; + }; + constructor( - private readonly integration: AzureIntegration, - private readonly deps: { + integration: AzureIntegration, + deps: { treeResponseFactory: ReadTreeResponseFactory; credentialsProvider: AzureDevOpsCredentialsProvider; }, - ) {} + ) { + this.integration = integration; + this.deps = deps; + } async read(url: string): Promise { const response = await this.readUrl(url); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.test.ts index d2d0d28d76..89ff98ba27 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.test.ts @@ -271,7 +271,7 @@ describe('BitbucketCloudUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock-12ab34cd56ef.tar.gz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get( @@ -399,7 +399,7 @@ describe('BitbucketCloudUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock-12ab34cd56ef.tar.gz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get( diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.ts index c968420a5e..3a228f1e9c 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.ts @@ -59,10 +59,15 @@ export class BitbucketCloudUrlReader implements UrlReaderService { }); }; + private readonly integration: BitbucketCloudIntegration; + private readonly deps: { treeResponseFactory: ReadTreeResponseFactory }; + constructor( - private readonly integration: BitbucketCloudIntegration, - private readonly deps: { treeResponseFactory: ReadTreeResponseFactory }, + integration: BitbucketCloudIntegration, + deps: { treeResponseFactory: ReadTreeResponseFactory }, ) { + this.integration = integration; + this.deps = deps; const { host, username, appPassword } = integration.config; if (username && !appPassword) { diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.test.ts index 5e82246298..1ab6342225 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.test.ts @@ -71,7 +71,7 @@ describe('BitbucketServerUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock.tgz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get( @@ -157,7 +157,7 @@ describe('BitbucketServerUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock.tgz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get( @@ -216,7 +216,7 @@ describe('BitbucketServerUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock.tgz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get( diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts index 3482bdf4bd..aba28b4fd7 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts @@ -58,10 +58,16 @@ export class BitbucketServerUrlReader implements UrlReaderService { }); }; + private readonly integration: BitbucketServerIntegration; + private readonly deps: { treeResponseFactory: ReadTreeResponseFactory }; + constructor( - private readonly integration: BitbucketServerIntegration, - private readonly deps: { treeResponseFactory: ReadTreeResponseFactory }, - ) {} + integration: BitbucketServerIntegration, + deps: { treeResponseFactory: ReadTreeResponseFactory }, + ) { + this.integration = integration; + this.deps = deps; + } async read(url: string): Promise { const response = await this.readUrl(url); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketUrlReader.test.ts index 29217ea1f5..cb9eb837f8 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketUrlReader.test.ts @@ -324,7 +324,7 @@ describe('BitbucketUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock-12ab34cd56ef.tar.gz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get( @@ -347,7 +347,7 @@ describe('BitbucketUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock.tgz', ), - ctx.body(privateBitbucketRepoBuffer), + ctx.body(new Uint8Array(privateBitbucketRepoBuffer)), ), ), rest.get( @@ -491,7 +491,7 @@ describe('BitbucketUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock-12ab34cd56ef.tar.gz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get( @@ -562,7 +562,7 @@ describe('BitbucketUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock.tgz', ), - ctx.body(privateBitbucketRepoBuffer), + ctx.body(new Uint8Array(privateBitbucketRepoBuffer)), ), ), rest.get( diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketUrlReader.ts index 4c6de31aa4..aac71d0194 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketUrlReader.ts @@ -69,11 +69,16 @@ export class BitbucketUrlReader implements UrlReaderService { }); }; + private readonly integration: BitbucketIntegration; + private readonly deps: { treeResponseFactory: ReadTreeResponseFactory }; + constructor( - private readonly integration: BitbucketIntegration, + integration: BitbucketIntegration, logger: LoggerService, - private readonly deps: { treeResponseFactory: ReadTreeResponseFactory }, + deps: { treeResponseFactory: ReadTreeResponseFactory }, ) { + this.integration = integration; + this.deps = deps; const { host, token, username, appPassword } = integration.config; const replacement = host === 'bitbucket.org' ? 'bitbucketCloud' : 'bitbucketServer'; diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.test.ts index 246c07631b..69c834201c 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.test.ts @@ -291,7 +291,7 @@ describe.skip('GerritUrlReader', () => { 'content-disposition', 'attachment; filename=web-refs/heads/master.tar.gz', ), - ctx.body(repoArchiveBuffer), + ctx.body(new Uint8Array(repoArchiveBuffer)), ), ), rest.get( @@ -304,7 +304,7 @@ describe.skip('GerritUrlReader', () => { 'content-disposition', 'attachment; filename=web-refs/heads/master-docs.tar.gz', ), - ctx.body(repoArchiveDocsBuffer), + ctx.body(new Uint8Array(repoArchiveDocsBuffer)), ), ), rest.get( @@ -317,7 +317,7 @@ describe.skip('GerritUrlReader', () => { 'content-disposition', 'attachment; filename=web-refs/heads/master.tar.gz', ), - ctx.body(repoArchiveBuffer), + ctx.body(new Uint8Array(repoArchiveBuffer)), ), ), ); @@ -330,7 +330,10 @@ describe.skip('GerritUrlReader', () => { it('reads the wanted files correctly using gitiles.', async () => { worker.use( rest.get(branchAPIUrl, (_, res, ctx) => { - return res(ctx.status(200), ctx.body(branchAPIresponse)); + return res( + ctx.status(200), + ctx.body(new Uint8Array(branchAPIresponse)), + ); }), ); @@ -353,7 +356,10 @@ describe.skip('GerritUrlReader', () => { it('throws NotModifiedError for matching etags.', async () => { worker.use( rest.get(branchAPIUrl, (_, res, ctx) => { - return res(ctx.status(200), ctx.body(branchAPIresponse)); + return res( + ctx.status(200), + ctx.body(new Uint8Array(branchAPIresponse)), + ); }), ); @@ -389,7 +395,10 @@ describe.skip('GerritUrlReader', () => { it('should returns wanted files with a subpath using gitiles', async () => { worker.use( rest.get(branchAPIUrl, (_, res, ctx) => { - return res(ctx.status(200), ctx.body(branchAPIresponse)); + return res( + ctx.status(200), + ctx.body(new Uint8Array(branchAPIresponse)), + ); }), ); @@ -462,7 +471,7 @@ describe.skip('GerritUrlReader', () => { ctx.status(200), ctx.set('Content-Type', 'application/json'), ctx.set('content-disposition', 'attachment'), - ctx.body(treeRecursiveResponse), + ctx.body(new Uint8Array(treeRecursiveResponse)), ); } @@ -522,7 +531,10 @@ describe.skip('GerritUrlReader', () => { it('reads the wanted files correctly using gitiles.', async () => { worker.use( rest.get(branchAPIUrl, (_, res, ctx) => { - return res(ctx.status(200), ctx.body(branchAPIresponse)); + return res( + ctx.status(200), + ctx.body(new Uint8Array(branchAPIresponse)), + ); }), ); @@ -549,7 +561,10 @@ describe.skip('GerritUrlReader', () => { it('throws NotModifiedError for matching etags.', async () => { worker.use( rest.get(branchAPIUrl, (_, res, ctx) => { - return res(ctx.status(200), ctx.body(branchAPIresponse)); + return res( + ctx.status(200), + ctx.body(new Uint8Array(branchAPIresponse)), + ); }), ); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.ts index bec062ee8b..9facb613d4 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GerritUrlReader.ts @@ -84,10 +84,16 @@ export class GerritUrlReader implements UrlReaderService { }); }; + private readonly integration: GerritIntegration; + private readonly deps: { treeResponseFactory: ReadTreeResponseFactory }; + constructor( - private readonly integration: GerritIntegration, - private readonly deps: { treeResponseFactory: ReadTreeResponseFactory }, - ) {} + integration: GerritIntegration, + deps: { treeResponseFactory: ReadTreeResponseFactory }, + ) { + this.integration = integration; + this.deps = deps; + } async read(url: string): Promise { const response = await this.readUrl(url); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.test.ts index 0adbc3381f..9242cd2f9b 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.test.ts @@ -279,7 +279,7 @@ describe('GiteaUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock.tar.gz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ); }, ), diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.ts index bce033c2ae..b1b4b79c34 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.ts @@ -62,12 +62,20 @@ export class GiteaUrlReader implements UrlReaderService { }); }; + private readonly integration: GiteaIntegration; + private readonly deps: { + treeResponseFactory: ReadTreeResponseFactory; + }; + constructor( - private readonly integration: GiteaIntegration, - private readonly deps: { + integration: GiteaIntegration, + deps: { treeResponseFactory: ReadTreeResponseFactory; }, - ) {} + ) { + this.integration = integration; + this.deps = deps; + } async read(url: string): Promise { const response = await this.readUrl(url); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GithubUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GithubUrlReader.test.ts index 861b3ad7cb..fe832e124f 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GithubUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GithubUrlReader.test.ts @@ -373,7 +373,7 @@ describe('GithubUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock-etag123.tar.gz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get( @@ -390,7 +390,7 @@ describe('GithubUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock-etag123.tar.gz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get( @@ -480,7 +480,7 @@ describe('GithubUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock-etag123.tar.gz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ); }, ), @@ -531,7 +531,7 @@ describe('GithubUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock-etag123.tar.gz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ); }, ), @@ -720,7 +720,7 @@ describe('GithubUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock-etag123.tar.gz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get( @@ -733,7 +733,7 @@ describe('GithubUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock-etag123.tar.gz', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), ); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GithubUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GithubUrlReader.ts index fe0bd08fec..7846262da3 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GithubUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GithubUrlReader.ts @@ -77,13 +77,21 @@ export class GithubUrlReader implements UrlReaderService { }); }; + private readonly integration: GithubIntegration; + private readonly deps: { + treeResponseFactory: ReadTreeResponseFactory; + credentialsProvider: GithubCredentialsProvider; + }; + constructor( - private readonly integration: GithubIntegration, - private readonly deps: { + integration: GithubIntegration, + deps: { treeResponseFactory: ReadTreeResponseFactory; credentialsProvider: GithubCredentialsProvider; }, ) { + this.integration = integration; + this.deps = deps; if (!integration.config.apiBaseUrl && !integration.config.rawBaseUrl) { throw new Error( `GitHub integration '${integration.title}' must configure an explicit apiBaseUrl or rawBaseUrl`, diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.test.ts index 337325f6f8..65cd275574 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.test.ts @@ -310,7 +310,7 @@ describe('GitlabUrlReader', () => { 'content-disposition', 'attachment; filename="mock-main-sha123abc.zip"', ), - ctx.body(archiveBuffer), + ctx.body(new Uint8Array(archiveBuffer)), ), ), rest.get( @@ -388,7 +388,7 @@ describe('GitlabUrlReader', () => { 'content-disposition', 'attachment; filename="mock-main-sha123abc.zip"', ), - ctx.body(archiveBuffer), + ctx.body(new Uint8Array(archiveBuffer)), ), ), ); @@ -437,7 +437,7 @@ describe('GitlabUrlReader', () => { 'content-disposition', 'attachment; filename="mock-main-sha123abc.zip"', ), - ctx.body(archiveBuffer), + ctx.body(new Uint8Array(archiveBuffer)), ), ), ); @@ -632,7 +632,7 @@ describe('GitlabUrlReader', () => { 'content-disposition', `attachment; filename="${filename}"`, ), - ctx.body(body), + ctx.body(new Uint8Array(body)), ); }, ), diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.ts index 11746fef0d..19f1846dda 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.ts @@ -63,10 +63,16 @@ export class GitlabUrlReader implements UrlReaderService { }); }; + private readonly integration: GitLabIntegration; + private readonly deps: { treeResponseFactory: ReadTreeResponseFactory }; + constructor( - private readonly integration: GitLabIntegration, - private readonly deps: { treeResponseFactory: ReadTreeResponseFactory }, - ) {} + integration: GitLabIntegration, + deps: { treeResponseFactory: ReadTreeResponseFactory }, + ) { + this.integration = integration; + this.deps = deps; + } async read(url: string): Promise { const response = await this.readUrl(url); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GoogleGcsUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GoogleGcsUrlReader.ts index 36f2e183c7..0bc5add43f 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GoogleGcsUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GoogleGcsUrlReader.ts @@ -88,10 +88,16 @@ export class GoogleGcsUrlReader implements UrlReaderService { return [{ reader, predicate }]; }; + private readonly integration: GoogleGcsIntegrationConfig; + private readonly storage: GoogleCloud.Storage; + constructor( - private readonly integration: GoogleGcsIntegrationConfig, - private readonly storage: GoogleCloud.Storage, - ) {} + integration: GoogleGcsIntegrationConfig, + storage: GoogleCloud.Storage, + ) { + this.integration = integration; + this.storage = storage; + } private readStreamFromUrl(url: string): Readable { const { bucket, key } = parseURL(url); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.test.ts index 37dab25883..33a0e1a088 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.test.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.test.ts @@ -215,7 +215,7 @@ describe('HarnessUrlReader', () => { 'content-disposition', 'attachment; filename=backstage-mock.zip', ), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ); }, ), diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.ts index bc2e0dab11..ebc9b7be83 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/HarnessUrlReader.ts @@ -64,12 +64,20 @@ export class HarnessUrlReader implements UrlReaderService { }); }; + private readonly integration: HarnessIntegration; + private readonly deps: { + treeResponseFactory: ReadTreeResponseFactory; + }; + constructor( - private readonly integration: HarnessIntegration, - private readonly deps: { + integration: HarnessIntegration, + deps: { treeResponseFactory: ReadTreeResponseFactory; }, - ) {} + ) { + this.integration = integration; + this.deps = deps; + } async read(url: string): Promise { const response = await this.readUrl(url); return response.buffer(); diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.ts index a8f187d7b8..816b734b28 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.ts @@ -36,7 +36,11 @@ export class DefaultReadTreeResponseFactory implements ReadTreeResponseFactory { ); } - constructor(private readonly workDir: string) {} + private readonly workDir: string; + + constructor(workDir: string) { + this.workDir = workDir; + } async fromTarArchive( options: ReadTreeResponseFactoryOptions & { diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ReadableArrayResponse.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ReadableArrayResponse.ts index 6b39672ddd..095b58edb1 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ReadableArrayResponse.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ReadableArrayResponse.ts @@ -35,12 +35,13 @@ const pipeline = promisify(pipelineCb); */ export class ReadableArrayResponse implements UrlReaderServiceReadTreeResponse { private read = false; + private readonly stream: FromReadableArrayOptions; + private readonly workDir: string; + public readonly etag: string; - constructor( - private readonly stream: FromReadableArrayOptions, - private readonly workDir: string, - public readonly etag: string, - ) { + constructor(stream: FromReadableArrayOptions, workDir: string, etag: string) { + this.stream = stream; + this.workDir = workDir; this.etag = etag; } diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/TarArchiveResponse.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/TarArchiveResponse.ts index 9fb1d3fe7e..3102137f64 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/TarArchiveResponse.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/TarArchiveResponse.ts @@ -37,15 +37,27 @@ const pipeline = promisify(pipelineCb); */ export class TarArchiveResponse implements UrlReaderServiceReadTreeResponse { private read = false; + private readonly stream: Readable; + private readonly subPath: string; + private readonly workDir: string; + public readonly etag: string; + private readonly filter?: (path: string, info: { size: number }) => boolean; + private readonly stripFirstDirectory: boolean; constructor( - private readonly stream: Readable, - private readonly subPath: string, - private readonly workDir: string, - public readonly etag: string, - private readonly filter?: (path: string, info: { size: number }) => boolean, - private readonly stripFirstDirectory: boolean = true, + stream: Readable, + subPath: string, + workDir: string, + etag: string, + filter?: (path: string, info: { size: number }) => boolean, + stripFirstDirectory: boolean = true, ) { + this.stream = stream; + this.subPath = subPath; + this.workDir = workDir; + this.etag = etag; + this.filter = filter; + this.stripFirstDirectory = stripFirstDirectory; if (subPath) { if (!subPath.endsWith('/')) { this.subPath += '/'; diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ZipArchiveResponse.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ZipArchiveResponse.ts index 5c0b6f77bc..2d5a743172 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ZipArchiveResponse.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ZipArchiveResponse.ts @@ -32,14 +32,24 @@ import { resolveSafeChildPath } from '@backstage/backend-plugin-api'; */ export class ZipArchiveResponse implements UrlReaderServiceReadTreeResponse { private read = false; + private readonly stream: Readable; + private readonly subPath: string; + private readonly workDir: string; + public readonly etag: string; + private readonly filter?: (path: string, info: { size: number }) => boolean; constructor( - private readonly stream: Readable, - private readonly subPath: string, - private readonly workDir: string, - public readonly etag: string, - private readonly filter?: (path: string, info: { size: number }) => boolean, + stream: Readable, + subPath: string, + workDir: string, + etag: string, + filter?: (path: string, info: { size: number }) => boolean, ) { + this.stream = stream; + this.subPath = subPath; + this.workDir = workDir; + this.etag = etag; + this.filter = filter; if (subPath) { if (!subPath.endsWith('/')) { this.subPath += '/'; diff --git a/packages/backend-dynamic-feature-service/src/loader/CommonJSModuleLoader.ts b/packages/backend-dynamic-feature-service/src/loader/CommonJSModuleLoader.ts index 28203a2019..b960e5bd38 100644 --- a/packages/backend-dynamic-feature-service/src/loader/CommonJSModuleLoader.ts +++ b/packages/backend-dynamic-feature-service/src/loader/CommonJSModuleLoader.ts @@ -36,8 +36,10 @@ export type CommonJSModuleLoaderOptions = { */ export class CommonJSModuleLoader implements ModuleLoader { private module: any; + public readonly options: CommonJSModuleLoaderOptions; - constructor(public readonly options: CommonJSModuleLoaderOptions) { + constructor(options: CommonJSModuleLoaderOptions) { + this.options = options; this.module = require('node:module'); } diff --git a/packages/backend-dynamic-feature-service/src/manager/plugin-manager.ts b/packages/backend-dynamic-feature-service/src/manager/plugin-manager.ts index 0162cbef2d..02ddd6168b 100644 --- a/packages/backend-dynamic-feature-service/src/manager/plugin-manager.ts +++ b/packages/backend-dynamic-feature-service/src/manager/plugin-manager.ts @@ -99,11 +99,18 @@ export class DynamicPluginManager implements DynamicPluginProvider { private readonly _plugins: DynamicPlugin[]; private _availablePackages: ScannedPluginPackage[]; + private readonly logger: LoggerService; + private readonly packages: ScannedPluginPackage[]; + private readonly moduleLoader: ModuleLoader; + private constructor( - private readonly logger: LoggerService, - private readonly packages: ScannedPluginPackage[], - private readonly moduleLoader: ModuleLoader, + logger: LoggerService, + packages: ScannedPluginPackage[], + moduleLoader: ModuleLoader, ) { + this.logger = logger; + this.packages = packages; + this.moduleLoader = moduleLoader; this._plugins = []; this._availablePackages = packages; } @@ -304,7 +311,11 @@ export const dynamicPluginsServiceFactory = Object.assign( ); class DynamicPluginsEnabledFeatureDiscoveryService { - constructor(private readonly dynamicPlugins: DynamicPluginProvider) {} + private readonly dynamicPlugins: DynamicPluginProvider; + + constructor(dynamicPlugins: DynamicPluginProvider) { + this.dynamicPlugins = dynamicPlugins; + } async getBackendFeatures(): Promise<{ features: Array }> { return { diff --git a/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.ts b/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.ts index 5b254908b2..a468a382d5 100644 --- a/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.ts +++ b/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.ts @@ -42,13 +42,22 @@ export class PluginScanner { private configUnsubscribe?: () => void; private rootDirectoryWatcher?: chokidar.FSWatcher; private subscribers: (() => void)[] = []; + private readonly config: Config; + private readonly logger: LoggerService; + private readonly backstageRoot: string; + private readonly preferAlpha: boolean; private constructor( - private readonly config: Config, - private readonly logger: LoggerService, - private readonly backstageRoot: string, - private readonly preferAlpha: boolean, - ) {} + config: Config, + logger: LoggerService, + backstageRoot: string, + preferAlpha: boolean, + ) { + this.config = config; + this.logger = logger; + this.backstageRoot = backstageRoot; + this.preferAlpha = preferAlpha; + } static create(options: DynamicPluginScannerOptions): PluginScanner { const scanner = new PluginScanner( diff --git a/packages/backend-test-utils/src/alpha/services/MockActionsRegistry.ts b/packages/backend-test-utils/src/alpha/services/MockActionsRegistry.ts index 49c80b7a3d..94e5987afd 100644 --- a/packages/backend-test-utils/src/alpha/services/MockActionsRegistry.ts +++ b/packages/backend-test-utils/src/alpha/services/MockActionsRegistry.ts @@ -65,7 +65,11 @@ import { export class MockActionsRegistry implements ActionsRegistryService, ActionsService { - private constructor(private readonly logger: LoggerService) {} + private readonly logger: LoggerService; + + private constructor(logger: LoggerService) { + this.logger = logger; + } static create(opts: { logger: LoggerService }) { return new MockActionsRegistry(opts.logger); diff --git a/packages/catalog-model/src/EntityPolicies.ts b/packages/catalog-model/src/EntityPolicies.ts index e5aaeb0c20..feadee906c 100644 --- a/packages/catalog-model/src/EntityPolicies.ts +++ b/packages/catalog-model/src/EntityPolicies.ts @@ -19,7 +19,11 @@ import { Entity, EntityPolicy } from './entity'; // Helper that requires that all of a set of policies can be successfully // applied class AllEntityPolicies implements EntityPolicy { - constructor(private readonly policies: EntityPolicy[]) {} + private readonly policies: EntityPolicy[]; + + constructor(policies: EntityPolicy[]) { + this.policies = policies; + } async enforce(entity: Entity): Promise { let result = entity; @@ -39,7 +43,11 @@ class AllEntityPolicies implements EntityPolicy { // Helper that requires that at least one of a set of policies can be // successfully applied class AnyEntityPolicy implements EntityPolicy { - constructor(private readonly policies: EntityPolicy[]) {} + private readonly policies: EntityPolicy[]; + + constructor(policies: EntityPolicy[]) { + this.policies = policies; + } async enforce(entity: Entity): Promise { for (const policy of this.policies) { diff --git a/packages/cli-node/src/monorepo/Lockfile.ts b/packages/cli-node/src/monorepo/Lockfile.ts index d7a6f5f0b6..ff624191af 100644 --- a/packages/cli-node/src/monorepo/Lockfile.ts +++ b/packages/cli-node/src/monorepo/Lockfile.ts @@ -133,10 +133,16 @@ export class Lockfile { return new Lockfile(packages, data); } + private readonly packages: Map; + private readonly data: LockfileData; + private constructor( - private readonly packages: Map, - private readonly data: LockfileData, - ) {} + packages: Map, + data: LockfileData, + ) { + this.packages = packages; + this.data = data; + } /** Returns the name of all packages available in the lockfile */ get(name: string): LockfileQueryEntry[] | undefined { diff --git a/packages/cli/src/lib/versioning/Lockfile.ts b/packages/cli/src/lib/versioning/Lockfile.ts index 047cf5aefc..7a9a2c801a 100644 --- a/packages/cli/src/lib/versioning/Lockfile.ts +++ b/packages/cli/src/lib/versioning/Lockfile.ts @@ -106,11 +106,19 @@ export class Lockfile { return new Lockfile(packages, data, legacy); } + private readonly packages: Map; + private readonly data: LockfileData; + private readonly legacy: boolean; + private constructor( - private readonly packages: Map, - private readonly data: LockfileData, - private readonly legacy: boolean = false, - ) {} + packages: Map, + data: LockfileData, + legacy: boolean = false, + ) { + this.packages = packages; + this.data = data; + this.legacy = legacy; + } /** Get the entries for a single package in the lockfile */ get(name: string): LockfileQueryEntry[] | undefined { diff --git a/packages/cli/src/modules/create-github-app/commands/create-github-app/GithubCreateAppServer.ts b/packages/cli/src/modules/create-github-app/commands/create-github-app/GithubCreateAppServer.ts index b1825ad996..9bfe14174d 100644 --- a/packages/cli/src/modules/create-github-app/commands/create-github-app/GithubCreateAppServer.ts +++ b/packages/cli/src/modules/create-github-app/commands/create-github-app/GithubCreateAppServer.ts @@ -58,10 +58,12 @@ export class GithubCreateAppServer { return server.start(); } - private constructor( - private readonly actionUrl: string, - private readonly permissions: string[], - ) { + private readonly actionUrl: string; + private readonly permissions: string[]; + + private constructor(actionUrl: string, permissions: string[]) { + this.actionUrl = actionUrl; + this.permissions = permissions; const webhookId = crypto .randomBytes(15) .toString('base64') diff --git a/packages/config-loader/src/sources/ObservableConfigProxy.ts b/packages/config-loader/src/sources/ObservableConfigProxy.ts index 3d2084beac..cc4859ea5a 100644 --- a/packages/config-loader/src/sources/ObservableConfigProxy.ts +++ b/packages/config-loader/src/sources/ObservableConfigProxy.ts @@ -27,11 +27,18 @@ export class ObservableConfigProxy implements Config { return new ObservableConfigProxy(undefined, undefined, abortController); } + private readonly parent?: ObservableConfigProxy; + private readonly parentKey?: string; + private readonly abortController?: AbortController; + private constructor( - private readonly parent?: ObservableConfigProxy, - private readonly parentKey?: string, - private readonly abortController?: AbortController, + parent?: ObservableConfigProxy, + parentKey?: string, + abortController?: AbortController, ) { + this.parent = parent; + this.parentKey = parentKey; + this.abortController = abortController; if (parent && !parentKey) { throw new Error('parentKey is required if parent is set'); } diff --git a/packages/config-loader/src/sources/StaticConfigSource.ts b/packages/config-loader/src/sources/StaticConfigSource.ts index 014ead8a99..9fc7ccf8dc 100644 --- a/packages/config-loader/src/sources/StaticConfigSource.ts +++ b/packages/config-loader/src/sources/StaticConfigSource.ts @@ -37,10 +37,13 @@ export interface StaticConfigSourceOptions { /** @internal */ class StaticObservableConfigSource implements ConfigSource { - constructor( - private readonly data: Observable, - private readonly context: string, - ) {} + private readonly data: Observable; + private readonly context: string; + + constructor(data: Observable, context: string) { + this.data = data; + this.context = context; + } async *readConfigData( options?: ReadConfigDataOptions | undefined, @@ -131,10 +134,16 @@ export class StaticConfigSource implements ConfigSource { return new StaticConfigSource(data, context); } + private readonly promise: JsonObject | PromiseLike; + private readonly context: string; + private constructor( - private readonly promise: JsonObject | PromiseLike, - private readonly context: string, - ) {} + promise: JsonObject | PromiseLike, + context: string, + ) { + this.promise = promise; + this.context = context; + } async *readConfigData(): AsyncConfigSourceGenerator { yield { configs: [{ data: await this.promise, context: this.context }] }; diff --git a/packages/config/report.api.md b/packages/config/report.api.md index 848687d0cc..94c4652b44 100644 --- a/packages/config/report.api.md +++ b/packages/config/report.api.md @@ -48,7 +48,7 @@ export class ConfigReader implements Config { constructor( data: JsonObject_2 | undefined, context?: string, - fallback?: ConfigReader | undefined, + fallback?: ConfigReader, prefix?: string, ); static fromConfigs(configs: AppConfig[]): ConfigReader; diff --git a/packages/config/src/reader.ts b/packages/config/src/reader.ts index 7ad0cf738d..8186ee8faa 100644 --- a/packages/config/src/reader.ts +++ b/packages/config/src/reader.ts @@ -139,12 +139,22 @@ export class ConfigReader implements Config { ); } + private readonly data: JsonObject | undefined; + private readonly context: string; + private readonly fallback?: ConfigReader; + private readonly prefix: string; + constructor( - private readonly data: JsonObject | undefined, - private readonly context: string = 'mock-config', - private readonly fallback?: ConfigReader, - private readonly prefix: string = '', - ) {} + data: JsonObject | undefined, + context: string = 'mock-config', + fallback?: ConfigReader, + prefix: string = '', + ) { + this.data = data; + this.context = context; + this.fallback = fallback; + this.prefix = prefix; + } /** {@inheritdoc Config.has} */ has(key: string): boolean { diff --git a/packages/core-app-api/src/apis/implementations/DiscoveryApi/FrontendHostDiscovery.ts b/packages/core-app-api/src/apis/implementations/DiscoveryApi/FrontendHostDiscovery.ts index 9c10c386d6..27430ab3bb 100644 --- a/packages/core-app-api/src/apis/implementations/DiscoveryApi/FrontendHostDiscovery.ts +++ b/packages/core-app-api/src/apis/implementations/DiscoveryApi/FrontendHostDiscovery.ts @@ -71,10 +71,16 @@ export class FrontendHostDiscovery implements DiscoveryApi { ); } + private readonly endpoints: Map; + private readonly defaultEndpoint: DiscoveryApi; + private constructor( - private readonly endpoints: Map, - private readonly defaultEndpoint: DiscoveryApi, - ) {} + endpoints: Map, + defaultEndpoint: DiscoveryApi, + ) { + this.endpoints = endpoints; + this.defaultEndpoint = defaultEndpoint; + } async getBaseUrl(pluginId: string): Promise { const endpoint = this.endpoints.get(pluginId); diff --git a/packages/core-app-api/src/apis/implementations/ErrorApi/ErrorAlerter.ts b/packages/core-app-api/src/apis/implementations/ErrorApi/ErrorAlerter.ts index 350213d938..34d527f73a 100644 --- a/packages/core-app-api/src/apis/implementations/ErrorApi/ErrorAlerter.ts +++ b/packages/core-app-api/src/apis/implementations/ErrorApi/ErrorAlerter.ts @@ -27,10 +27,13 @@ import { * @public */ export class ErrorAlerter implements ErrorApi { - constructor( - private readonly alertApi: AlertApi, - private readonly errorApi: ErrorApi, - ) {} + private readonly alertApi: AlertApi; + private readonly errorApi: ErrorApi; + + constructor(alertApi: AlertApi, errorApi: ErrorApi) { + this.alertApi = alertApi; + this.errorApi = errorApi; + } post(error: ErrorApiError, context?: ErrorApiErrorContext) { if (!context?.hidden) { diff --git a/packages/core-app-api/src/apis/implementations/FetchApi/IdentityAuthInjectorFetchMiddleware.ts b/packages/core-app-api/src/apis/implementations/FetchApi/IdentityAuthInjectorFetchMiddleware.ts index 842f9191eb..7c13c3ce74 100644 --- a/packages/core-app-api/src/apis/implementations/FetchApi/IdentityAuthInjectorFetchMiddleware.ts +++ b/packages/core-app-api/src/apis/implementations/FetchApi/IdentityAuthInjectorFetchMiddleware.ts @@ -64,12 +64,22 @@ export class IdentityAuthInjectorFetchMiddleware implements FetchMiddleware { }); } + public readonly identityApi: IdentityApi; + public readonly allowUrl: (url: string) => boolean; + public readonly headerName: string; + public readonly headerValue: (pluginId: string) => string; + constructor( - public readonly identityApi: IdentityApi, - public readonly allowUrl: (url: string) => boolean, - public readonly headerName: string, - public readonly headerValue: (pluginId: string) => string, - ) {} + identityApi: IdentityApi, + allowUrl: (url: string) => boolean, + headerName: string, + headerValue: (pluginId: string) => string, + ) { + this.identityApi = identityApi; + this.allowUrl = allowUrl; + this.headerName = headerName; + this.headerValue = headerValue; + } apply(next: typeof fetch): typeof fetch { return async (input, init) => { diff --git a/packages/core-app-api/src/apis/implementations/StorageApi/WebStorage.ts b/packages/core-app-api/src/apis/implementations/StorageApi/WebStorage.ts index 06ae6fc76a..ddb2b9a611 100644 --- a/packages/core-app-api/src/apis/implementations/StorageApi/WebStorage.ts +++ b/packages/core-app-api/src/apis/implementations/StorageApi/WebStorage.ts @@ -30,10 +30,13 @@ export const buckets = new Map(); * @public */ export class WebStorage implements StorageApi { - constructor( - private readonly namespace: string, - private readonly errorApi: ErrorApi, - ) {} + private readonly namespace: string; + private readonly errorApi: ErrorApi; + + constructor(namespace: string, errorApi: ErrorApi) { + this.namespace = namespace; + this.errorApi = errorApi; + } private static hasSubscribed = false; diff --git a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.tsx b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.tsx index b6e79b20ed..c1a0b36efb 100644 --- a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.tsx +++ b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.tsx @@ -37,7 +37,7 @@ const resourceRef = createTranslationRef({ bar: 'Bar', }, translations: { - sv: () => Promise.resolve({ default: { foo: 'Föö', bar: null } }), + sv: () => Promise.resolve({ default: { foo: 'Föö' } as any }), }, }); diff --git a/packages/core-app-api/src/app/AppManager.test.tsx b/packages/core-app-api/src/app/AppManager.test.tsx index 054c28ad03..3981da56ad 100644 --- a/packages/core-app-api/src/app/AppManager.test.tsx +++ b/packages/core-app-api/src/app/AppManager.test.tsx @@ -323,7 +323,7 @@ describe('Integration Test', () => { foo: 'Foo', }, translations: { - de: () => Promise.resolve({ default: { foo: 'Bar' } }), + de: () => Promise.resolve({ default: { foo: 'Bar' } as any }), }, }); diff --git a/packages/core-app-api/src/routing/RouteResolver.ts b/packages/core-app-api/src/routing/RouteResolver.ts index 11eb753bc6..620096ebd0 100644 --- a/packages/core-app-api/src/routing/RouteResolver.ts +++ b/packages/core-app-api/src/routing/RouteResolver.ts @@ -170,16 +170,25 @@ function resolveBasePath( } export class RouteResolver { + private readonly routePaths: Map; + private readonly routeParents: Map; + private readonly routeObjects: BackstageRouteObject[]; + private readonly routeBindings: Map; + private readonly appBasePath: string; // base path without a trailing slash + constructor( - private readonly routePaths: Map, - private readonly routeParents: Map, - private readonly routeObjects: BackstageRouteObject[], - private readonly routeBindings: Map< - ExternalRouteRef, - RouteRef | SubRouteRef - >, - private readonly appBasePath: string, // base path without a trailing slash - ) {} + routePaths: Map, + routeParents: Map, + routeObjects: BackstageRouteObject[], + routeBindings: Map, + appBasePath: string, // base path without a trailing slash + ) { + this.routePaths = routePaths; + this.routeParents = routeParents; + this.routeObjects = routeObjects; + this.routeBindings = routeBindings; + this.appBasePath = appBasePath; + } resolve( anyRouteRef: diff --git a/packages/core-components/src/components/LogViewer/AnsiProcessor.ts b/packages/core-components/src/components/LogViewer/AnsiProcessor.ts index bcd5af7ced..0db5e69211 100644 --- a/packages/core-components/src/components/LogViewer/AnsiProcessor.ts +++ b/packages/core-components/src/components/LogViewer/AnsiProcessor.ts @@ -78,11 +78,12 @@ export interface AnsiChunk { export class AnsiLine { text: string; + readonly lineNumber: number; + readonly chunks: AnsiChunk[]; - constructor( - readonly lineNumber: number = 1, - readonly chunks: AnsiChunk[] = [], - ) { + constructor(lineNumber: number = 1, chunks: AnsiChunk[] = []) { + this.lineNumber = lineNumber; + this.chunks = chunks; this.text = chunks .map(c => c.text) .join('') diff --git a/packages/core-components/src/layout/SignInPage/UserIdentity.ts b/packages/core-components/src/layout/SignInPage/UserIdentity.ts index 781cb47c0e..910b46b016 100644 --- a/packages/core-components/src/layout/SignInPage/UserIdentity.ts +++ b/packages/core-components/src/layout/SignInPage/UserIdentity.ts @@ -96,13 +96,19 @@ export class UserIdentity implements IdentityApi { return new UserIdentity(options.identity, options.authApi, options.profile); } + private readonly identity: BackstageUserIdentity; + private readonly authApi: ProfileInfoApi & BackstageIdentityApi & SessionApi; + private readonly profile?: ProfileInfo; + private constructor( - private readonly identity: BackstageUserIdentity, - private readonly authApi: ProfileInfoApi & - BackstageIdentityApi & - SessionApi, - private readonly profile?: ProfileInfo, - ) {} + identity: BackstageUserIdentity, + authApi: ProfileInfoApi & BackstageIdentityApi & SessionApi, + profile?: ProfileInfo, + ) { + this.identity = identity; + this.authApi = authApi; + this.profile = profile; + } /** {@inheritdoc @backstage/core-plugin-api#IdentityApi.getUserId} */ getUserId(): string { diff --git a/packages/core-plugin-api/src/analytics/Tracker.ts b/packages/core-plugin-api/src/analytics/Tracker.ts index 4ae31b43fd..5507075551 100644 --- a/packages/core-plugin-api/src/analytics/Tracker.ts +++ b/packages/core-plugin-api/src/analytics/Tracker.ts @@ -65,14 +65,19 @@ const globalEvents = getOrCreateGlobalSingleton( export const routableExtensionRenderedEvent = '_ROUTABLE-EXTENSION-RENDERED'; export class Tracker implements AnalyticsTracker { + private readonly analyticsApi: AnalyticsApi; + private context: AnalyticsContextValue; + constructor( - private readonly analyticsApi: AnalyticsApi, - private context: AnalyticsContextValue = { + analyticsApi: AnalyticsApi, + context: AnalyticsContextValue = { routeRef: 'unknown', pluginId: 'root', extension: 'App', }, ) { + this.analyticsApi = analyticsApi; + this.context = context; // Only register a single beforeunload event across all trackers. if (!globalEvents.beforeUnloadRegistered) { // Before the page unloads, attempt to capture any deferred navigation diff --git a/packages/core-plugin-api/src/extensions/useElementFilter.tsx b/packages/core-plugin-api/src/extensions/useElementFilter.tsx index fa04e7c2c6..c696b3b77e 100644 --- a/packages/core-plugin-api/src/extensions/useElementFilter.tsx +++ b/packages/core-plugin-api/src/extensions/useElementFilter.tsx @@ -135,10 +135,13 @@ export interface ElementCollection { } class Collection implements ElementCollection { - constructor( - private readonly node: ReactNode, - private readonly featureFlagsApi: FeatureFlagsApi, - ) {} + private readonly node: ReactNode; + private readonly featureFlagsApi: FeatureFlagsApi; + + constructor(node: ReactNode, featureFlagsApi: FeatureFlagsApi) { + this.node = node; + this.featureFlagsApi = featureFlagsApi; + } selectByComponentData(query: { key: string; withStrictError?: string }) { const selection = selectChildren( diff --git a/packages/core-plugin-api/src/routing/ExternalRouteRef.ts b/packages/core-plugin-api/src/routing/ExternalRouteRef.ts index d61001aa10..16e2f9bc72 100644 --- a/packages/core-plugin-api/src/routing/ExternalRouteRef.ts +++ b/packages/core-plugin-api/src/routing/ExternalRouteRef.ts @@ -34,12 +34,22 @@ export class ExternalRouteRefImpl< declare $$routeRefType: 'external'; readonly [routeRefType] = 'external'; + private readonly id: string; + readonly params: ParamKeys; + readonly optional: Optional; + readonly defaultTarget: string | undefined; + constructor( - private readonly id: string, - readonly params: ParamKeys, - readonly optional: Optional, - readonly defaultTarget: string | undefined, - ) {} + id: string, + params: ParamKeys, + optional: Optional, + defaultTarget: string | undefined, + ) { + this.id = id; + this.params = params; + this.optional = optional; + this.defaultTarget = defaultTarget; + } toString() { return `routeRef{type=external,id=${this.id}}`; diff --git a/packages/core-plugin-api/src/routing/RouteRef.ts b/packages/core-plugin-api/src/routing/RouteRef.ts index 36ca3f073d..d78f3ddb8d 100644 --- a/packages/core-plugin-api/src/routing/RouteRef.ts +++ b/packages/core-plugin-api/src/routing/RouteRef.ts @@ -32,10 +32,13 @@ export class RouteRefImpl declare $$routeRefType: 'absolute'; readonly [routeRefType] = 'absolute'; - constructor( - private readonly id: string, - readonly params: ParamKeys, - ) {} + private readonly id: string; + readonly params: ParamKeys; + + constructor(id: string, params: ParamKeys) { + this.id = id; + this.params = params; + } get title() { return this.id; diff --git a/packages/core-plugin-api/src/routing/SubRouteRef.ts b/packages/core-plugin-api/src/routing/SubRouteRef.ts index b08368d74e..ed9ded41d4 100644 --- a/packages/core-plugin-api/src/routing/SubRouteRef.ts +++ b/packages/core-plugin-api/src/routing/SubRouteRef.ts @@ -36,12 +36,22 @@ export class SubRouteRefImpl declare $$routeRefType: 'sub'; readonly [routeRefType] = 'sub'; + private readonly id: string; + readonly path: string; + readonly parent: RouteRef; + readonly params: ParamKeys; + constructor( - private readonly id: string, - readonly path: string, - readonly parent: RouteRef, - readonly params: ParamKeys, - ) {} + id: string, + path: string, + parent: RouteRef, + params: ParamKeys, + ) { + this.id = id; + this.path = path; + this.parent = parent; + this.params = params; + } toString() { return `routeRef{type=sub,id=${this.id}}`; diff --git a/packages/frontend-app-api/src/routing/RouteResolver.ts b/packages/frontend-app-api/src/routing/RouteResolver.ts index 4b2f906e45..4c0ad0e3fa 100644 --- a/packages/frontend-app-api/src/routing/RouteResolver.ts +++ b/packages/frontend-app-api/src/routing/RouteResolver.ts @@ -179,18 +179,31 @@ function resolveBasePath( } export class RouteResolver implements RouteResolutionApi { + private readonly routePaths: Map; + private readonly routeParents: Map; + private readonly routeObjects: BackstageRouteObject[]; + private readonly routeBindings: Map; + private readonly appBasePath: string; // base path without a trailing slash + private readonly routeAliasResolver: RouteAliasResolver; + private readonly routeRefsById: Map; + constructor( - private readonly routePaths: Map, - private readonly routeParents: Map, - private readonly routeObjects: BackstageRouteObject[], - private readonly routeBindings: Map< - ExternalRouteRef, - RouteRef | SubRouteRef - >, - private readonly appBasePath: string, // base path without a trailing slash - private readonly routeAliasResolver: RouteAliasResolver, - private readonly routeRefsById: Map, - ) {} + routePaths: Map, + routeParents: Map, + routeObjects: BackstageRouteObject[], + routeBindings: Map, + appBasePath: string, // base path without a trailing slash + routeAliasResolver: RouteAliasResolver, + routeRefsById: Map, + ) { + this.routePaths = routePaths; + this.routeParents = routeParents; + this.routeObjects = routeObjects; + this.routeBindings = routeBindings; + this.appBasePath = appBasePath; + this.routeAliasResolver = routeAliasResolver; + this.routeRefsById = routeRefsById; + } resolve( anyRouteRef: diff --git a/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx b/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx index 6c6d75415b..9e75d19454 100644 --- a/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx +++ b/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx @@ -115,11 +115,13 @@ function deduplicateFeatures( // Helps delay callers from reaching out to the API before the app tree has been materialized class AppTreeApiProxy implements AppTreeApi { #routeInfo?: RouteInfo; + private readonly tree: AppTree; + private readonly appBasePath: string; - constructor( - private readonly tree: AppTree, - private readonly appBasePath: string, - ) {} + constructor(tree: AppTree, appBasePath: string) { + this.tree = tree; + this.appBasePath = appBasePath; + } private checkIfInitialized() { if (!this.#routeInfo) { @@ -163,13 +165,16 @@ class RouteResolutionApiProxy implements RouteResolutionApi { #delegate: RouteResolutionApi | undefined; #routeObjects: BackstageRouteObject[] | undefined; + private readonly routeBindings: Map; + private readonly appBasePath: string; + constructor( - private readonly routeBindings: Map< - ExternalRouteRef, - RouteRef | SubRouteRef - >, - private readonly appBasePath: string, - ) {} + routeBindings: Map, + appBasePath: string, + ) { + this.routeBindings = routeBindings; + this.appBasePath = appBasePath; + } resolve( anyRouteRef: diff --git a/packages/frontend-plugin-api/src/analytics/Tracker.ts b/packages/frontend-plugin-api/src/analytics/Tracker.ts index dd0d770354..5aae3ec19d 100644 --- a/packages/frontend-plugin-api/src/analytics/Tracker.ts +++ b/packages/frontend-plugin-api/src/analytics/Tracker.ts @@ -65,13 +65,18 @@ const globalEvents = getOrCreateGlobalSingleton( export const routableExtensionRenderedEvent = '_ROUTABLE-EXTENSION-RENDERED'; export class Tracker implements AnalyticsTracker { + private readonly analyticsApi: AnalyticsApi; + private context: AnalyticsContextValue; + constructor( - private readonly analyticsApi: AnalyticsApi, - private context: AnalyticsContextValue = { + analyticsApi: AnalyticsApi, + context: AnalyticsContextValue = { pluginId: 'root', extensionId: 'App', }, ) { + this.analyticsApi = analyticsApi; + this.context = context; // Only register a single beforeunload event across all trackers. if (!globalEvents.beforeUnloadRegistered) { // Before the page unloads, attempt to capture any deferred navigation diff --git a/packages/frontend-plugin-api/src/routing/ExternalRouteRef.ts b/packages/frontend-plugin-api/src/routing/ExternalRouteRef.ts index 6ce36707c0..3de276f85c 100644 --- a/packages/frontend-plugin-api/src/routing/ExternalRouteRef.ts +++ b/packages/frontend-plugin-api/src/routing/ExternalRouteRef.ts @@ -71,13 +71,17 @@ class ExternalRouteRefImpl implements InternalExternalRouteRef { readonly $$type = '@backstage/ExternalRouteRef' as any; + readonly params: string[]; + readonly defaultTarget: string | undefined; constructor( - readonly params: string[] = [], - readonly defaultTarget: string | undefined, + params: string[] = [], + defaultTarget: string | undefined, creationSite: string, ) { super(params, creationSite); + this.params = params; + this.defaultTarget = defaultTarget; } getDefaultTarget() { diff --git a/packages/integration-aws-node/src/DefaultAwsCredentialsManager.ts b/packages/integration-aws-node/src/DefaultAwsCredentialsManager.ts index b54a4fda26..a02fea1b1c 100644 --- a/packages/integration-aws-node/src/DefaultAwsCredentialsManager.ts +++ b/packages/integration-aws-node/src/DefaultAwsCredentialsManager.ts @@ -199,14 +199,22 @@ export class DefaultAwsCredentialsManager implements AwsCredentialsManager { ); } + private readonly accountCredentialProviders: Map< + string, + AwsCredentialProvider + >; + private readonly accountDefaults: AwsIntegrationDefaultAccountConfig; + private readonly mainAccountCredentialProvider: AwsCredentialProvider; + private constructor( - private readonly accountCredentialProviders: Map< - string, - AwsCredentialProvider - >, - private readonly accountDefaults: AwsIntegrationDefaultAccountConfig, - private readonly mainAccountCredentialProvider: AwsCredentialProvider, - ) {} + accountCredentialProviders: Map, + accountDefaults: AwsIntegrationDefaultAccountConfig, + mainAccountCredentialProvider: AwsCredentialProvider, + ) { + this.accountCredentialProviders = accountCredentialProviders; + this.accountDefaults = accountDefaults; + this.mainAccountCredentialProvider = mainAccountCredentialProvider; + } /** * Returns an {@link AwsCredentialProvider} for a given AWS account. diff --git a/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.ts b/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.ts index eaaabe8b0f..d2c1e37a65 100644 --- a/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.ts +++ b/packages/integration/src/github/SingleInstanceGithubCredentialsProvider.ts @@ -279,10 +279,16 @@ export class SingleInstanceGithubCredentialsProvider ); }; + private readonly githubAppCredentialsMux: GithubAppCredentialsMux; + private readonly token?: string; + private constructor( - private readonly githubAppCredentialsMux: GithubAppCredentialsMux, - private readonly token?: string, - ) {} + githubAppCredentialsMux: GithubAppCredentialsMux, + token?: string, + ) { + this.githubAppCredentialsMux = githubAppCredentialsMux; + this.token = token; + } /** * Returns {@link GithubCredentials} for a given URL. diff --git a/packages/repo-tools/src/commands/package-docs/Cache.ts b/packages/repo-tools/src/commands/package-docs/Cache.ts index 487db81347..ec0811b77a 100644 --- a/packages/repo-tools/src/commands/package-docs/Cache.ts +++ b/packages/repo-tools/src/commands/package-docs/Cache.ts @@ -41,12 +41,19 @@ const cacheEntrySchema = z.object({ export class PackageDocsCache { // A map of package directory to package hash. private keyCache: Map; + private readonly lockfile: Lockfile; + // A map of package directory to cache entry. + private readonly cache: Map; + private readonly baseDirectory: string; + constructor( - private readonly lockfile: Lockfile, - // A map of package directory to cache entry. - private readonly cache: Map, - private readonly baseDirectory: string, + lockfile: Lockfile, + cache: Map, + baseDirectory: string, ) { + this.lockfile = lockfile; + this.cache = cache; + this.baseDirectory = baseDirectory; this.keyCache = new Map(); } static async loadAsync(baseDirectory: string, lockfile: Lockfile) { diff --git a/plugins/auth-backend-module-cloudflare-access-provider/src/helpers.ts b/plugins/auth-backend-module-cloudflare-access-provider/src/helpers.ts index 64f79f113a..bf736da2f6 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/src/helpers.ts +++ b/plugins/auth-backend-module-cloudflare-access-provider/src/helpers.ts @@ -66,14 +66,28 @@ export class AuthHelper { ); } + private readonly teamName: string; + private readonly serviceTokens: ServiceToken[]; + private readonly jwtHeaderName: string; + private readonly authorizationCookieName: string; + private readonly keySet: ReturnType; + private readonly cache?: CacheService; + private constructor( - private readonly teamName: string, - private readonly serviceTokens: ServiceToken[], - private readonly jwtHeaderName: string, - private readonly authorizationCookieName: string, - private readonly keySet: ReturnType, - private readonly cache?: CacheService, - ) {} + teamName: string, + serviceTokens: ServiceToken[], + jwtHeaderName: string, + authorizationCookieName: string, + keySet: ReturnType, + cache?: CacheService, + ) { + this.teamName = teamName; + this.serviceTokens = serviceTokens; + this.jwtHeaderName = jwtHeaderName; + this.authorizationCookieName = authorizationCookieName; + this.keySet = keySet; + this.cache = cache; + } async authenticate(req: express.Request): Promise { // JWTs generated by Access are available in a request header as diff --git a/plugins/auth-backend/src/identity/FirestoreKeyStore.ts b/plugins/auth-backend/src/identity/FirestoreKeyStore.ts index 3b998a4fe9..437b605f59 100644 --- a/plugins/auth-backend/src/identity/FirestoreKeyStore.ts +++ b/plugins/auth-backend/src/identity/FirestoreKeyStore.ts @@ -49,11 +49,15 @@ export class FirestoreKeyStore implements KeyStore { ); } - private constructor( - private readonly database: Firestore, - private readonly path: string, - private readonly timeout: number, - ) {} + private readonly database: Firestore; + private readonly path: string; + private readonly timeout: number; + + private constructor(database: Firestore, path: string, timeout: number) { + this.database = database; + this.path = path; + this.timeout = timeout; + } static async verifyConnection( keyStore: FirestoreKeyStore, diff --git a/plugins/auth-backend/src/lib/resolvers/CatalogAuthResolverContext.ts b/plugins/auth-backend/src/lib/resolvers/CatalogAuthResolverContext.ts index 269c7131dc..03becbb723 100644 --- a/plugins/auth-backend/src/lib/resolvers/CatalogAuthResolverContext.ts +++ b/plugins/auth-backend/src/lib/resolvers/CatalogAuthResolverContext.ts @@ -70,15 +70,31 @@ export class CatalogAuthResolverContext implements AuthResolverContext { ); } + public readonly logger: LoggerService; + public readonly tokenIssuer: TokenIssuer; + public readonly catalogIdentityClient: CatalogIdentityClient; + private readonly catalog: CatalogService; + private readonly auth: AuthService; + private readonly userInfo: UserInfoDatabase; + private readonly ownershipResolver?: AuthOwnershipResolver; + private constructor( - public readonly logger: LoggerService, - public readonly tokenIssuer: TokenIssuer, - public readonly catalogIdentityClient: CatalogIdentityClient, - private readonly catalog: CatalogService, - private readonly auth: AuthService, - private readonly userInfo: UserInfoDatabase, - private readonly ownershipResolver?: AuthOwnershipResolver, - ) {} + logger: LoggerService, + tokenIssuer: TokenIssuer, + catalogIdentityClient: CatalogIdentityClient, + catalog: CatalogService, + auth: AuthService, + userInfo: UserInfoDatabase, + ownershipResolver?: AuthOwnershipResolver, + ) { + this.logger = logger; + this.tokenIssuer = tokenIssuer; + this.catalogIdentityClient = catalogIdentityClient; + this.catalog = catalog; + this.auth = auth; + this.userInfo = userInfo; + this.ownershipResolver = ownershipResolver; + } async issueToken(params: TokenParams) { const { sub, ent = [sub], ...additionalClaims } = params.claims; diff --git a/plugins/auth-backend/src/service/OidcRouter.ts b/plugins/auth-backend/src/service/OidcRouter.ts index 9a3308b4eb..0e21777de9 100644 --- a/plugins/auth-backend/src/service/OidcRouter.ts +++ b/plugins/auth-backend/src/service/OidcRouter.ts @@ -28,14 +28,28 @@ import { OidcDatabase } from '../database/OidcDatabase'; import { json } from 'express'; export class OidcRouter { + private readonly oidc: OidcService; + private readonly logger: LoggerService; + private readonly auth: AuthService; + private readonly appUrl: string; + private readonly httpAuth: HttpAuthService; + private readonly config: RootConfigService; + private constructor( - private readonly oidc: OidcService, - private readonly logger: LoggerService, - private readonly auth: AuthService, - private readonly appUrl: string, - private readonly httpAuth: HttpAuthService, - private readonly config: RootConfigService, - ) {} + oidc: OidcService, + logger: LoggerService, + auth: AuthService, + appUrl: string, + httpAuth: HttpAuthService, + config: RootConfigService, + ) { + this.oidc = oidc; + this.logger = logger; + this.auth = auth; + this.appUrl = appUrl; + this.httpAuth = httpAuth; + this.config = config; + } static create(options: { auth: AuthService; diff --git a/plugins/auth-backend/src/service/OidcService.ts b/plugins/auth-backend/src/service/OidcService.ts index b4c6bb122b..1ab6f51391 100644 --- a/plugins/auth-backend/src/service/OidcService.ts +++ b/plugins/auth-backend/src/service/OidcService.ts @@ -28,14 +28,28 @@ import { DateTime } from 'luxon'; import matcher from 'matcher'; export class OidcService { + private readonly auth: AuthService; + private readonly tokenIssuer: TokenIssuer; + private readonly baseUrl: string; + private readonly userInfo: UserInfoDatabase; + private readonly oidc: OidcDatabase; + private readonly config: RootConfigService; + private constructor( - private readonly auth: AuthService, - private readonly tokenIssuer: TokenIssuer, - private readonly baseUrl: string, - private readonly userInfo: UserInfoDatabase, - private readonly oidc: OidcDatabase, - private readonly config: RootConfigService, - ) {} + auth: AuthService, + tokenIssuer: TokenIssuer, + baseUrl: string, + userInfo: UserInfoDatabase, + oidc: OidcDatabase, + config: RootConfigService, + ) { + this.auth = auth; + this.tokenIssuer = tokenIssuer; + this.baseUrl = baseUrl; + this.userInfo = userInfo; + this.oidc = oidc; + this.config = config; + } static create(options: { auth: AuthService; diff --git a/plugins/auth-node/src/oauth/CookieScopeManager.ts b/plugins/auth-node/src/oauth/CookieScopeManager.ts index d2db6d20a9..23018a1bfd 100644 --- a/plugins/auth-node/src/oauth/CookieScopeManager.ts +++ b/plugins/auth-node/src/oauth/CookieScopeManager.ts @@ -78,13 +78,22 @@ export class CookieScopeManager { ); } + private readonly scopeTransform: ( + requested: Iterable, + granted: Iterable, + ) => string; + private readonly cookieManager?: OAuthCookieManager; + private constructor( - private readonly scopeTransform: ( + scopeTransform: ( requested: Iterable, granted: Iterable, ) => string, - private readonly cookieManager?: OAuthCookieManager, - ) {} + cookieManager?: OAuthCookieManager, + ) { + this.scopeTransform = scopeTransform; + this.cookieManager = cookieManager; + } async start( req: express.Request, diff --git a/plugins/bitbucket-cloud-common/report.api.md b/plugins/bitbucket-cloud-common/report.api.md index 11f0c93593..e41442f6da 100644 --- a/plugins/bitbucket-cloud-common/report.api.md +++ b/plugins/bitbucket-cloud-common/report.api.md @@ -518,7 +518,7 @@ export class WithPagination< constructor( createUrl: (options: PaginationOptions) => URL, fetch: (url: URL) => Promise, - pagelen?: number | undefined, + pagelen?: number, ); // (undocumented) getPage(options?: PaginationOptions): Promise; diff --git a/plugins/bitbucket-cloud-common/src/pagination.ts b/plugins/bitbucket-cloud-common/src/pagination.ts index 5d699a4a6f..abf56287d2 100644 --- a/plugins/bitbucket-cloud-common/src/pagination.ts +++ b/plugins/bitbucket-cloud-common/src/pagination.ts @@ -27,11 +27,19 @@ export class WithPagination< TPage extends Models.Paginated, TResultItem, > { + private readonly createUrl: (options: PaginationOptions) => URL; + private readonly fetch: (url: URL) => Promise; + private readonly pagelen?: number; + constructor( - private readonly createUrl: (options: PaginationOptions) => URL, - private readonly fetch: (url: URL) => Promise, - private readonly pagelen?: number, - ) {} + createUrl: (options: PaginationOptions) => URL, + fetch: (url: URL) => Promise, + pagelen?: number, + ) { + this.createUrl = createUrl; + this.fetch = fetch; + this.pagelen = pagelen; + } getPage(options?: PaginationOptions): Promise { const opts = { page: 1, pagelen: this.pagelen ?? 100, ...options }; diff --git a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts index 97857559d1..be1a0c885a 100644 --- a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts +++ b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts @@ -105,13 +105,20 @@ export class AwsS3EntityProvider implements EntityProvider { }); } + private readonly config: AwsS3Config; + private readonly integration: AwsS3Integration; + private readonly awsCredentialsManager: AwsCredentialsManager; + private constructor( - private readonly config: AwsS3Config, - private readonly integration: AwsS3Integration, - private readonly awsCredentialsManager: AwsCredentialsManager, + config: AwsS3Config, + integration: AwsS3Integration, + awsCredentialsManager: AwsCredentialsManager, logger: LoggerService, taskRunner: SchedulerServiceTaskRunner, ) { + this.config = config; + this.integration = integration; + this.awsCredentialsManager = awsCredentialsManager; this.logger = logger.child({ target: this.getProviderName(), }); diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureBlobStorageEntityProvider.ts b/plugins/catalog-backend-module-azure/src/providers/AzureBlobStorageEntityProvider.ts index ae2fbcb3ff..fdb05b0781 100644 --- a/plugins/catalog-backend-module-azure/src/providers/AzureBlobStorageEntityProvider.ts +++ b/plugins/catalog-backend-module-azure/src/providers/AzureBlobStorageEntityProvider.ts @@ -105,13 +105,20 @@ export class AzureBlobStorageEntityProvider implements EntityProvider { ); }); } + private readonly config: AzureBlobStorageConfig; + private readonly integration: AzureBlobStorageIntergation; + private readonly credentialsProvider: DefaultAzureCredentialsManager; + private constructor( - private readonly config: AzureBlobStorageConfig, - private readonly integration: AzureBlobStorageIntergation, - private readonly credentialsProvider: DefaultAzureCredentialsManager, + config: AzureBlobStorageConfig, + integration: AzureBlobStorageIntergation, + credentialsProvider: DefaultAzureCredentialsManager, logger: LoggerService, schedule: SchedulerServiceTaskRunner, ) { + this.config = config; + this.integration = integration; + this.credentialsProvider = credentialsProvider; this.logger = logger.child({ target: this.getProviderName() }); this.scheduleFn = this.createScheduleFn(schedule); } diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts index 2b6070539f..5869d0e2ba 100644 --- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts +++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts @@ -97,13 +97,20 @@ export class AzureDevOpsEntityProvider implements EntityProvider { }); } + private readonly config: AzureDevOpsConfig; + private readonly integration: AzureIntegration; + private readonly credentialsProvider: AzureDevOpsCredentialsProvider; + private constructor( - private readonly config: AzureDevOpsConfig, - private readonly integration: AzureIntegration, - private readonly credentialsProvider: AzureDevOpsCredentialsProvider, + config: AzureDevOpsConfig, + integration: AzureIntegration, + credentialsProvider: AzureDevOpsCredentialsProvider, logger: LoggerService, taskRunner: SchedulerServiceTaskRunner, ) { + this.config = config; + this.integration = integration; + this.credentialsProvider = credentialsProvider; this.logger = logger.child({ target: this.getProviderName(), }); diff --git a/plugins/catalog-backend-module-backstage-openapi/src/InternalOpenApiDocumentationProvider.ts b/plugins/catalog-backend-module-backstage-openapi/src/InternalOpenApiDocumentationProvider.ts index 8ce406d3b6..d488831ec6 100644 --- a/plugins/catalog-backend-module-backstage-openapi/src/InternalOpenApiDocumentationProvider.ts +++ b/plugins/catalog-backend-module-backstage-openapi/src/InternalOpenApiDocumentationProvider.ts @@ -171,14 +171,22 @@ const formatDefinition = ( export class InternalOpenApiDocumentationProvider implements EntityProvider { private connection?: EntityProviderConnection; private readonly scheduleFn: () => Promise; + public readonly config: Config; + public readonly discovery: DiscoveryService; + public readonly logger: LoggerService; + public readonly auth: AuthService; constructor( - public readonly config: Config, - public readonly discovery: DiscoveryService, - public readonly logger: LoggerService, - public readonly auth: AuthService, + config: Config, + discovery: DiscoveryService, + logger: LoggerService, + auth: AuthService, taskRunner: SchedulerServiceTaskRunner, ) { + this.config = config; + this.discovery = discovery; + this.logger = logger; + this.auth = auth; this.scheduleFn = this.createScheduleFn(taskRunner); } diff --git a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.test.ts b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.test.ts index d55ac1259d..79de9a9d6d 100644 --- a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.test.ts @@ -120,7 +120,7 @@ describe('GerritEntityProvider', () => { res( ctx.status(200), ctx.set('Content-Type', 'application/json'), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), ); @@ -157,7 +157,7 @@ describe('GerritEntityProvider', () => { res( ctx.status(200), ctx.set('Content-Type', 'application/json'), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), ); @@ -192,7 +192,7 @@ describe('GerritEntityProvider', () => { res( ctx.status(200), ctx.set('Content-Type', 'application/json'), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), rest.get('https://g.com/gerrit/projects/:project/HEAD', (_, res, ctx) => @@ -400,7 +400,7 @@ describe('GerritEntityProvider', () => { res( ctx.status(200), ctx.set('Content-Type', 'application/json'), - ctx.body(repoBuffer), + ctx.body(new Uint8Array(repoBuffer)), ), ), ); diff --git a/plugins/catalog-backend-module-ldap/src/ldap/client.ts b/plugins/catalog-backend-module-ldap/src/ldap/client.ts index ac0be476d5..3608612f5f 100644 --- a/plugins/catalog-backend-module-ldap/src/ldap/client.ts +++ b/plugins/catalog-backend-module-ldap/src/ldap/client.ts @@ -89,10 +89,13 @@ export class LdapClient { }); } - constructor( - private readonly client: Client, - private readonly logger: LoggerService, - ) {} + private readonly client: Client; + private readonly logger: LoggerService; + + constructor(client: Client, logger: LoggerService) { + this.client = client; + this.logger = logger; + } /** * Performs an LDAP search operation. diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.ts index 83d0f0647b..94f4e88df1 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.ts @@ -107,10 +107,13 @@ export class MicrosoftGraphClient { * @param tokenCredential - instance of `TokenCredential` that is used to acquire token for Graph API calls * */ - constructor( - private readonly baseUrl: string, - private readonly tokenCredential: TokenCredential, - ) {} + private readonly baseUrl: string; + private readonly tokenCredential: TokenCredential; + + constructor(baseUrl: string, tokenCredential: TokenCredential) { + this.baseUrl = baseUrl; + this.tokenCredential = tokenCredential; + } /** * Get a collection of resource from Graph API and diff --git a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts index 423b7eb466..bf55d92d18 100644 --- a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts @@ -289,17 +289,27 @@ export class MicrosoftGraphOrgEntityProvider implements EntityProvider { return result; } - constructor( - private options: { - id: string; - provider: MicrosoftGraphProviderConfig; - logger: LoggerService; - userTransformer?: UserTransformer; - groupTransformer?: GroupTransformer; - organizationTransformer?: OrganizationTransformer; - providerConfigTransformer?: ProviderConfigTransformer; - }, - ) {} + private options: { + id: string; + provider: MicrosoftGraphProviderConfig; + logger: LoggerService; + userTransformer?: UserTransformer; + groupTransformer?: GroupTransformer; + organizationTransformer?: OrganizationTransformer; + providerConfigTransformer?: ProviderConfigTransformer; + }; + + constructor(options: { + id: string; + provider: MicrosoftGraphProviderConfig; + logger: LoggerService; + userTransformer?: UserTransformer; + groupTransformer?: GroupTransformer; + organizationTransformer?: OrganizationTransformer; + providerConfigTransformer?: ProviderConfigTransformer; + }) { + this.options = options; + } /** {@inheritdoc @backstage/plugin-catalog-node#EntityProvider.getProviderName} */ getProviderName() { diff --git a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts index ce25ba2bd1..91ecd45bf5 100644 --- a/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts +++ b/plugins/catalog-backend-module-unprocessed/src/UnprocessedEntitiesModule.ts @@ -46,12 +46,19 @@ export class UnprocessedEntitiesModule { private readonly httpAuth: HttpAuthService; + private readonly database: Knex; + private readonly router: Pick; + private readonly permissions: PermissionsService; + private constructor( - private readonly database: Knex, - private readonly router: Pick, - private readonly permissions: PermissionsService, + database: Knex, + router: Pick, + permissions: PermissionsService, httpAuth: HttpAuthService, ) { + this.database = database; + this.router = router; + this.permissions = permissions; this.moduleRouter = Router(); this.router.use(this.moduleRouter); diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 50c3cbb1c8..a421ca19b2 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -55,14 +55,20 @@ import { LoggerService } from '@backstage/backend-plugin-api'; const BATCH_SIZE = 50; export class DefaultProcessingDatabase implements ProcessingDatabase { - constructor( - private readonly options: { - database: Knex; - logger: LoggerService; - refreshInterval: ProcessingIntervalFunction; - events: EventsService; - }, - ) { + private readonly options: { + database: Knex; + logger: LoggerService; + refreshInterval: ProcessingIntervalFunction; + events: EventsService; + }; + + constructor(options: { + database: Knex; + logger: LoggerService; + refreshInterval: ProcessingIntervalFunction; + events: EventsService; + }) { + this.options = options; initDatabaseMetrics(options.database); } diff --git a/plugins/catalog-backend/src/database/DefaultProviderDatabase.ts b/plugins/catalog-backend/src/database/DefaultProviderDatabase.ts index 958e1b0f2d..f6f89d066c 100644 --- a/plugins/catalog-backend/src/database/DefaultProviderDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProviderDatabase.ts @@ -45,12 +45,14 @@ import { const BATCH_SIZE = 50; export class DefaultProviderDatabase implements ProviderDatabase { - constructor( - private readonly options: { - database: Knex; - logger: LoggerService; - }, - ) {} + private readonly options: { + database: Knex; + logger: LoggerService; + }; + + constructor(options: { database: Knex; logger: LoggerService }) { + this.options = options; + } async transaction(fn: (tx: Transaction) => Promise): Promise { try { diff --git a/plugins/catalog-backend/src/ingestion/CatalogRules.ts b/plugins/catalog-backend/src/ingestion/CatalogRules.ts index 15e620a443..d344eaf20d 100644 --- a/plugins/catalog-backend/src/ingestion/CatalogRules.ts +++ b/plugins/catalog-backend/src/ingestion/CatalogRules.ts @@ -166,7 +166,11 @@ export class DefaultCatalogRulesEnforcer implements CatalogRulesEnforcer { return new DefaultCatalogRulesEnforcer(rules); } - constructor(private readonly rules: CatalogRule[]) {} + private readonly rules: CatalogRule[]; + + constructor(rules: CatalogRule[]) { + this.rules = rules; + } /** * Checks whether a specific entity/location combination is allowed diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts index 79873264a3..9fb979437d 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts @@ -87,16 +87,25 @@ function addProcessorAttributes( export class DefaultCatalogProcessingOrchestrator implements CatalogProcessingOrchestrator { - constructor( - private readonly options: { - processors: CatalogProcessor[]; - integrations: ScmIntegrationRegistry; - logger: LoggerService; - parser: CatalogProcessorParser; - policy: EntityPolicy; - rulesEnforcer: CatalogRulesEnforcer; - }, - ) {} + private readonly options: { + processors: CatalogProcessor[]; + integrations: ScmIntegrationRegistry; + logger: LoggerService; + parser: CatalogProcessorParser; + policy: EntityPolicy; + rulesEnforcer: CatalogRulesEnforcer; + }; + + constructor(options: { + processors: CatalogProcessor[]; + integrations: ScmIntegrationRegistry; + logger: LoggerService; + parser: CatalogProcessorParser; + policy: EntityPolicy; + rulesEnforcer: CatalogRulesEnforcer; + }) { + this.options = options; + } async process( request: EntityProcessingRequest, diff --git a/plugins/catalog-backend/src/processing/ProcessorCacheManager.ts b/plugins/catalog-backend/src/processing/ProcessorCacheManager.ts index 8e0e382910..537163375c 100644 --- a/plugins/catalog-backend/src/processing/ProcessorCacheManager.ts +++ b/plugins/catalog-backend/src/processing/ProcessorCacheManager.ts @@ -24,7 +24,11 @@ import { isObject } from './util'; class SingleProcessorSubCache implements CatalogProcessorCache { private newState?: JsonObject; - constructor(private readonly existingState?: JsonObject) {} + private readonly existingState?: JsonObject; + + constructor(existingState?: JsonObject) { + this.existingState = existingState; + } async get( key: string, @@ -52,7 +56,11 @@ class SingleProcessorCache implements CatalogProcessorCache { private newState?: JsonObject; private subCaches: Map = new Map(); - constructor(private readonly existingState?: JsonObject) {} + private readonly existingState?: JsonObject; + + constructor(existingState?: JsonObject) { + this.existingState = existingState; + } async get( key: string, @@ -99,7 +107,11 @@ class SingleProcessorCache implements CatalogProcessorCache { export class ProcessorCacheManager { private caches = new Map(); - constructor(private readonly existingState: JsonObject) {} + private readonly existingState: JsonObject; + + constructor(existingState: JsonObject) { + this.existingState = existingState; + } forProcessor( processor: CatalogProcessor, diff --git a/plugins/catalog-backend/src/processing/ProcessorOutputCollector.ts b/plugins/catalog-backend/src/processing/ProcessorOutputCollector.ts index ee488fc1d5..03b8415d56 100644 --- a/plugins/catalog-backend/src/processing/ProcessorOutputCollector.ts +++ b/plugins/catalog-backend/src/processing/ProcessorOutputCollector.ts @@ -47,10 +47,13 @@ export class ProcessorOutputCollector { private readonly refreshKeys = new Array(); private done = false; - constructor( - private readonly logger: LoggerService, - private readonly parentEntity: Entity, - ) {} + private readonly logger: LoggerService; + private readonly parentEntity: Entity; + + constructor(logger: LoggerService, parentEntity: Entity) { + this.logger = logger; + this.parentEntity = parentEntity; + } generic(): (i: CatalogProcessorResult) => void { return i => this.receive(this.logger, i); diff --git a/plugins/catalog-backend/src/processing/connectEntityProviders.ts b/plugins/catalog-backend/src/processing/connectEntityProviders.ts index 30d30ca9b6..a22738e48c 100644 --- a/plugins/catalog-backend/src/processing/connectEntityProviders.ts +++ b/plugins/catalog-backend/src/processing/connectEntityProviders.ts @@ -29,13 +29,14 @@ import { class Connection implements EntityProviderConnection { readonly validateEntityEnvelope = entityEnvelopeSchemaValidator(); + private readonly config: { + id: string; + providerDatabase: ProviderDatabase; + }; - constructor( - private readonly config: { - id: string; - providerDatabase: ProviderDatabase; - }, - ) {} + constructor(config: { id: string; providerDatabase: ProviderDatabase }) { + this.config = config; + } async applyMutation(mutation: EntityProviderMutation): Promise { const db = this.config.providerDatabase; diff --git a/plugins/catalog-backend/src/processors/AnnotateLocationEntityProcessor.ts b/plugins/catalog-backend/src/processors/AnnotateLocationEntityProcessor.ts index 00864b69e7..9724e5ffa0 100644 --- a/plugins/catalog-backend/src/processors/AnnotateLocationEntityProcessor.ts +++ b/plugins/catalog-backend/src/processors/AnnotateLocationEntityProcessor.ts @@ -34,11 +34,13 @@ import { const commitHashRegExp = /\b[0-9a-f]{40,}\b/; /** @public */ export class AnnotateLocationEntityProcessor implements CatalogProcessor { - constructor( - private readonly options: { - integrations: ScmIntegrationRegistry; - }, - ) {} + private readonly options: { + integrations: ScmIntegrationRegistry; + }; + + constructor(options: { integrations: ScmIntegrationRegistry }) { + this.options = options; + } getProcessorName(): string { return 'AnnotateLocationEntityProcessor'; diff --git a/plugins/catalog-backend/src/processors/AnnotateScmSlugEntityProcessor.ts b/plugins/catalog-backend/src/processors/AnnotateScmSlugEntityProcessor.ts index a95a7e874e..a000f2f422 100644 --- a/plugins/catalog-backend/src/processors/AnnotateScmSlugEntityProcessor.ts +++ b/plugins/catalog-backend/src/processors/AnnotateScmSlugEntityProcessor.ts @@ -31,12 +31,17 @@ const AZURE_ACTIONS_ANNOTATION = 'dev.azure.com/project-repo'; /** @public */ export class AnnotateScmSlugEntityProcessor implements CatalogProcessor { - constructor( - private readonly opts: { - scmIntegrationRegistry: ScmIntegrationRegistry; - kinds?: string[]; - }, - ) {} + private readonly opts: { + scmIntegrationRegistry: ScmIntegrationRegistry; + kinds?: string[]; + }; + + constructor(opts: { + scmIntegrationRegistry: ScmIntegrationRegistry; + kinds?: string[]; + }) { + this.opts = opts; + } getProcessorName(): string { return 'AnnotateScmSlugEntityProcessor'; diff --git a/plugins/catalog-backend/src/processors/PlaceholderProcessor.ts b/plugins/catalog-backend/src/processors/PlaceholderProcessor.ts index bdbb0433d7..db045f648c 100644 --- a/plugins/catalog-backend/src/processors/PlaceholderProcessor.ts +++ b/plugins/catalog-backend/src/processors/PlaceholderProcessor.ts @@ -41,7 +41,11 @@ export type PlaceholderProcessorOptions = { * @public */ export class PlaceholderProcessor implements CatalogProcessor { - constructor(private readonly options: PlaceholderProcessorOptions) {} + private readonly options: PlaceholderProcessorOptions; + + constructor(options: PlaceholderProcessorOptions) { + this.options = options; + } getProcessorName(): string { return 'PlaceholderProcessor'; diff --git a/plugins/catalog-backend/src/processors/UrlReaderProcessor.ts b/plugins/catalog-backend/src/processors/UrlReaderProcessor.ts index 4440a81bae..806c5b9f3d 100644 --- a/plugins/catalog-backend/src/processors/UrlReaderProcessor.ts +++ b/plugins/catalog-backend/src/processors/UrlReaderProcessor.ts @@ -46,13 +46,13 @@ export class UrlReaderProcessor implements CatalogProcessor { // This limiter is used for only consuming a limited number of read streams // concurrently. #limiter: Limit; + private readonly options: { + reader: UrlReaderService; + logger: LoggerService; + }; - constructor( - private readonly options: { - reader: UrlReaderService; - logger: LoggerService; - }, - ) { + constructor(options: { reader: UrlReaderService; logger: LoggerService }) { + this.options = options; this.#limiter = limiterFactory(5); } diff --git a/plugins/catalog-backend/src/providers/ConfigLocationEntityProvider.ts b/plugins/catalog-backend/src/providers/ConfigLocationEntityProvider.ts index 9273beaf7f..07b7a0a36b 100644 --- a/plugins/catalog-backend/src/providers/ConfigLocationEntityProvider.ts +++ b/plugins/catalog-backend/src/providers/ConfigLocationEntityProvider.ts @@ -24,7 +24,11 @@ import { import { locationSpecToLocationEntity } from '../util/conversion'; export class ConfigLocationEntityProvider implements EntityProvider { - constructor(private readonly config: Config) {} + private readonly config: Config; + + constructor(config: Config) { + this.config = config; + } getProviderName(): string { return 'ConfigLocationProvider'; diff --git a/plugins/catalog-backend/src/providers/DefaultLocationStore.ts b/plugins/catalog-backend/src/providers/DefaultLocationStore.ts index 8420cbb8c4..d7cb945213 100644 --- a/plugins/catalog-backend/src/providers/DefaultLocationStore.ts +++ b/plugins/catalog-backend/src/providers/DefaultLocationStore.ts @@ -39,8 +39,11 @@ import { export class DefaultLocationStore implements LocationStore, EntityProvider { private _connection: EntityProviderConnection | undefined; + private readonly db: Knex; - constructor(private readonly db: Knex) {} + constructor(db: Knex) { + this.db = db; + } getProviderName(): string { return 'DefaultLocationStore'; diff --git a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts index 073e153dcc..d3d0dba5b3 100644 --- a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts @@ -44,11 +44,19 @@ import { } from '@backstage/backend-plugin-api'; export class AuthorizedEntitiesCatalog implements EntitiesCatalog { + private readonly entitiesCatalog: EntitiesCatalog; + private readonly permissionApi: PermissionsService; + private readonly transformConditions: ConditionTransformer; + constructor( - private readonly entitiesCatalog: EntitiesCatalog, - private readonly permissionApi: PermissionsService, - private readonly transformConditions: ConditionTransformer, - ) {} + entitiesCatalog: EntitiesCatalog, + permissionApi: PermissionsService, + transformConditions: ConditionTransformer, + ) { + this.entitiesCatalog = entitiesCatalog; + this.permissionApi = permissionApi; + this.transformConditions = transformConditions; + } async entities(request: EntitiesRequest): Promise { const authorizeDecision = ( diff --git a/plugins/catalog-backend/src/service/AuthorizedLocationAnalyzer.ts b/plugins/catalog-backend/src/service/AuthorizedLocationAnalyzer.ts index dc9af81dcd..d58d5efa2c 100644 --- a/plugins/catalog-backend/src/service/AuthorizedLocationAnalyzer.ts +++ b/plugins/catalog-backend/src/service/AuthorizedLocationAnalyzer.ts @@ -26,10 +26,13 @@ import { AnalyzeLocationRequest } from '@backstage/plugin-catalog-common'; import { AnalyzeLocationResponse } from '@backstage/plugin-catalog-common'; export class AuthorizedLocationAnalyzer implements LocationAnalyzer { - constructor( - private readonly service: LocationAnalyzer, - private readonly permissionApi: PermissionsService, - ) {} + private readonly service: LocationAnalyzer; + private readonly permissionApi: PermissionsService; + + constructor(service: LocationAnalyzer, permissionApi: PermissionsService) { + this.service = service; + this.permissionApi = permissionApi; + } async analyzeLocation( request: AnalyzeLocationRequest, diff --git a/plugins/catalog-backend/src/service/AuthorizedLocationService.ts b/plugins/catalog-backend/src/service/AuthorizedLocationService.ts index 3eb3eede12..e1662861ff 100644 --- a/plugins/catalog-backend/src/service/AuthorizedLocationService.ts +++ b/plugins/catalog-backend/src/service/AuthorizedLocationService.ts @@ -30,10 +30,16 @@ import { } from '@backstage/backend-plugin-api'; export class AuthorizedLocationService implements LocationService { + private readonly locationService: LocationService; + private readonly permissionApi: PermissionsService; + constructor( - private readonly locationService: LocationService, - private readonly permissionApi: PermissionsService, - ) {} + locationService: LocationService, + permissionApi: PermissionsService, + ) { + this.locationService = locationService; + this.permissionApi = permissionApi; + } async createLocation( spec: LocationInput, diff --git a/plugins/catalog-backend/src/service/AuthorizedRefreshService.ts b/plugins/catalog-backend/src/service/AuthorizedRefreshService.ts index a5a2491a04..dcbd08be2c 100644 --- a/plugins/catalog-backend/src/service/AuthorizedRefreshService.ts +++ b/plugins/catalog-backend/src/service/AuthorizedRefreshService.ts @@ -21,10 +21,13 @@ import { RefreshOptions, RefreshService } from './types'; import { PermissionsService } from '@backstage/backend-plugin-api'; export class AuthorizedRefreshService implements RefreshService { - constructor( - private readonly service: RefreshService, - private readonly permissionApi: PermissionsService, - ) {} + private readonly service: RefreshService; + private readonly permissionApi: PermissionsService; + + constructor(service: RefreshService, permissionApi: PermissionsService) { + this.service = service; + this.permissionApi = permissionApi; + } async refresh(options: RefreshOptions) { const authorizeDecision = ( diff --git a/plugins/catalog-backend/src/service/AuthorizedValidationService.ts b/plugins/catalog-backend/src/service/AuthorizedValidationService.ts index 870368c9ee..607954bc80 100644 --- a/plugins/catalog-backend/src/service/AuthorizedValidationService.ts +++ b/plugins/catalog-backend/src/service/AuthorizedValidationService.ts @@ -27,10 +27,16 @@ import { } from '@backstage/backend-plugin-api'; export class AuthorizedValidationService { + private readonly service: CatalogProcessingOrchestrator; + private readonly permissionApi: PermissionsService; + constructor( - private readonly service: CatalogProcessingOrchestrator, - private readonly permissionApi: PermissionsService, - ) {} + service: CatalogProcessingOrchestrator, + permissionApi: PermissionsService, + ) { + this.service = service; + this.permissionApi = permissionApi; + } async process( request: EntityProcessingRequest, diff --git a/plugins/catalog-backend/src/service/DefaultLocationService.ts b/plugins/catalog-backend/src/service/DefaultLocationService.ts index d0b603b90b..be84a7a84f 100644 --- a/plugins/catalog-backend/src/service/DefaultLocationService.ts +++ b/plugins/catalog-backend/src/service/DefaultLocationService.ts @@ -34,13 +34,21 @@ export type DefaultLocationServiceOptions = { }; export class DefaultLocationService implements LocationService { + private readonly store: LocationStore; + private readonly orchestrator: CatalogProcessingOrchestrator; + private readonly options: DefaultLocationServiceOptions; + constructor( - private readonly store: LocationStore, - private readonly orchestrator: CatalogProcessingOrchestrator, - private readonly options: DefaultLocationServiceOptions = { + store: LocationStore, + orchestrator: CatalogProcessingOrchestrator, + options: DefaultLocationServiceOptions = { allowedLocationTypes: ['url'], }, - ) {} + ) { + this.store = store; + this.orchestrator = orchestrator; + this.options = options; + } async createLocation( input: LocationInput, diff --git a/plugins/catalog-backend/src/tests/integration.test.ts b/plugins/catalog-backend/src/tests/integration.test.ts index 39871583af..5bc70ae57f 100644 --- a/plugins/catalog-backend/src/tests/integration.test.ts +++ b/plugins/catalog-backend/src/tests/integration.test.ts @@ -129,8 +129,10 @@ class WaitingProgressTracker implements ProgressTrackerWithErrorReports { #counts = new Map(); #errors = new Map(); #inFlight = new Array>(); + private readonly entityRefs?: Set; - constructor(private readonly entityRefs?: Set) { + constructor(entityRefs?: Set) { + this.entityRefs = entityRefs; let resolve: (errors: Record) => void; this.#promise = new Promise>(_resolve => { resolve = _resolve; diff --git a/plugins/catalog-backend/src/tests/performance/lib/catalogModuleSyntheticLoadEntities.ts b/plugins/catalog-backend/src/tests/performance/lib/catalogModuleSyntheticLoadEntities.ts index 7925b0b552..7c5589dc6d 100644 --- a/plugins/catalog-backend/src/tests/performance/lib/catalogModuleSyntheticLoadEntities.ts +++ b/plugins/catalog-backend/src/tests/performance/lib/catalogModuleSyntheticLoadEntities.ts @@ -144,10 +144,12 @@ export const common = { * @internal */ export class SyntheticLoadEntitiesProvider implements EntityProvider { - constructor( - private readonly load: SyntheticLoadOptions, - private readonly events: SyntheticLoadEvents, - ) { + private readonly load: SyntheticLoadOptions; + private readonly events: SyntheticLoadEvents; + + constructor(load: SyntheticLoadOptions, events: SyntheticLoadEvents) { + this.load = load; + this.events = events; validateSyntheticLoadOptions(load); } @@ -184,7 +186,10 @@ export class SyntheticLoadEntitiesProvider implements EntityProvider { * @internal */ export class SyntheticLoadEntitiesProcessor implements CatalogProcessor { - constructor(private readonly load: SyntheticLoadOptions) { + private readonly load: SyntheticLoadOptions; + + constructor(load: SyntheticLoadOptions) { + this.load = load; validateSyntheticLoadOptions(load); } diff --git a/plugins/catalog-backend/src/tests/performance/stitchingPerformance.test.ts b/plugins/catalog-backend/src/tests/performance/stitchingPerformance.test.ts index d0bf7c2cd8..cd3c103ad3 100644 --- a/plugins/catalog-backend/src/tests/performance/stitchingPerformance.test.ts +++ b/plugins/catalog-backend/src/tests/performance/stitchingPerformance.test.ts @@ -44,10 +44,13 @@ class Tracker { private insertBaseEntitiesEnd: number | undefined; private readonly deferred = createDeferred(); - constructor( - private readonly knex: Knex, - private readonly load: SyntheticLoadOptions, - ) {} + private readonly knex: Knex; + private readonly load: SyntheticLoadOptions; + + constructor(knex: Knex, load: SyntheticLoadOptions) { + this.knex = knex; + this.load = load; + } events(): SyntheticLoadEvents { return { diff --git a/plugins/catalog-import/src/api/AzureRepoApiClient.ts b/plugins/catalog-import/src/api/AzureRepoApiClient.ts index 56be626f5e..253aed97bc 100644 --- a/plugins/catalog-import/src/api/AzureRepoApiClient.ts +++ b/plugins/catalog-import/src/api/AzureRepoApiClient.ts @@ -132,7 +132,11 @@ export class RepoApiClient { return url.toString(); }; - constructor(private _options: RepoApiClientOptions) {} + private _options: RepoApiClientOptions; + + constructor(_options: RepoApiClientOptions) { + this._options = _options; + } private async get( path: string, diff --git a/plugins/catalog-react/report.api.md b/plugins/catalog-react/report.api.md index df32c51416..d013199a00 100644 --- a/plugins/catalog-react/report.api.md +++ b/plugins/catalog-react/report.api.md @@ -685,7 +685,7 @@ export class EntityUserFilter implements EntityFilter { // (undocumented) static owned(ownershipEntityRefs: string[]): EntityUserFilter; // (undocumented) - readonly refs?: string[] | undefined; + readonly refs?: string[]; // (undocumented) static starred(starredEntityRefs: string[]): EntityUserFilter; // (undocumented) diff --git a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.test.tsx b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.test.tsx index 37954cb276..d378b7e9b2 100644 --- a/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.test.tsx @@ -34,7 +34,11 @@ interface EntityFilters extends DefaultEntityFilters { const defaultOptions = ['option1', 'option2', 'option3', 'option4']; class EntityOptionFilter implements EntityFilter { - constructor(readonly values: string[]) {} + readonly values: string[]; + + constructor(values: string[]) { + this.values = values; + } filterEntity(entity: Entity): boolean { return this.values.every(v => diff --git a/plugins/catalog-react/src/filters.ts b/plugins/catalog-react/src/filters.ts index 8a6e664585..ebb7dbd459 100644 --- a/plugins/catalog-react/src/filters.ts +++ b/plugins/catalog-react/src/filters.ts @@ -30,7 +30,13 @@ import { EntityOrderQuery } from '@backstage/catalog-client'; * @public */ export class EntityKindFilter implements EntityFilter { - constructor(readonly value: string, readonly label: string) {} + readonly value: string; + readonly label: string; + + constructor(value: string, label: string) { + this.value = value; + this.label = label; + } getCatalogFilters(): Record { return { kind: this.value }; @@ -46,7 +52,11 @@ export class EntityKindFilter implements EntityFilter { * @public */ export class EntityTypeFilter implements EntityFilter { - constructor(readonly value: string | string[]) {} + readonly value: string | string[]; + + constructor(value: string | string[]) { + this.value = value; + } // Simplify `string | string[]` for consumers, always returns an array getTypes(): string[] { @@ -67,7 +77,11 @@ export class EntityTypeFilter implements EntityFilter { * @public */ export class EntityTagFilter implements EntityFilter { - constructor(readonly values: string[]) {} + readonly values: string[]; + + constructor(values: string[]) { + this.values = values; + } filterEntity(entity: Entity): boolean { return this.values.every(v => (entity.metadata.tags ?? []).includes(v)); @@ -87,7 +101,11 @@ export class EntityTagFilter implements EntityFilter { * @public */ export class EntityTextFilter implements EntityFilter { - constructor(readonly value: string) {} + readonly value: string; + + constructor(value: string) { + this.value = value; + } filterEntity(entity: Entity): boolean { const words = this.toUpperArray(this.value.split(/\s/)); @@ -180,7 +198,11 @@ export class EntityOwnerFilter implements EntityFilter { * @public */ export class EntityLifecycleFilter implements EntityFilter { - constructor(readonly values: string[]) {} + readonly values: string[]; + + constructor(values: string[]) { + this.values = values; + } getCatalogFilters(): Record { return { 'spec.lifecycle': this.values }; @@ -200,7 +222,11 @@ export class EntityLifecycleFilter implements EntityFilter { * @public */ export class EntityNamespaceFilter implements EntityFilter { - constructor(readonly values: string[]) {} + readonly values: string[]; + + constructor(values: string[]) { + this.values = values; + } getCatalogFilters(): Record { return { 'metadata.namespace': this.values }; @@ -218,10 +244,13 @@ export class EntityNamespaceFilter implements EntityFilter { * @public */ export class EntityUserFilter implements EntityFilter { - private constructor( - readonly value: UserListFilterKind, - readonly refs?: string[], - ) {} + readonly value: UserListFilterKind; + readonly refs?: string[]; + + private constructor(value: UserListFilterKind, refs?: string[]) { + this.value = value; + this.refs = refs; + } static owned(ownershipEntityRefs: string[]) { return new EntityUserFilter('owned', ownershipEntityRefs); @@ -277,11 +306,19 @@ export class EntityUserFilter implements EntityFilter { * @public */ export class UserListFilter implements EntityFilter { + readonly value: UserListFilterKind; + readonly isOwnedEntity: (entity: Entity) => boolean; + readonly isStarredEntity: (entity: Entity) => boolean; + constructor( - readonly value: UserListFilterKind, - readonly isOwnedEntity: (entity: Entity) => boolean, - readonly isStarredEntity: (entity: Entity) => boolean, - ) {} + value: UserListFilterKind, + isOwnedEntity: (entity: Entity) => boolean, + isStarredEntity: (entity: Entity) => boolean, + ) { + this.value = value; + this.isOwnedEntity = isOwnedEntity; + this.isStarredEntity = isStarredEntity; + } filterEntity(entity: Entity): boolean { switch (this.value) { @@ -304,7 +341,11 @@ export class UserListFilter implements EntityFilter { * @public */ export class EntityOrphanFilter implements EntityFilter { - constructor(readonly value: boolean) {} + readonly value: boolean; + + constructor(value: boolean) { + this.value = value; + } getCatalogFilters(): Record { if (this.value) { @@ -324,7 +365,11 @@ export class EntityOrphanFilter implements EntityFilter { * @public */ export class EntityErrorFilter implements EntityFilter { - constructor(readonly value: boolean) {} + readonly value: boolean; + + constructor(value: boolean) { + this.value = value; + } filterEntity(entity: Entity): boolean { const error = @@ -338,7 +383,11 @@ export class EntityErrorFilter implements EntityFilter { * @public */ export class EntityOrderFilter implements EntityFilter { - constructor(readonly values: [string, 'asc' | 'desc'][]) {} + readonly values: [string, 'asc' | 'desc'][]; + + constructor(values: [string, 'asc' | 'desc'][]) { + this.values = values; + } getOrderFilters(): EntityOrderQuery { return this.values.map(([field, order]) => ({ field, order })); diff --git a/plugins/catalog-unprocessed-entities/src/api/index.ts b/plugins/catalog-unprocessed-entities/src/api/index.ts index dfff3e15f7..67daa81319 100644 --- a/plugins/catalog-unprocessed-entities/src/api/index.ts +++ b/plugins/catalog-unprocessed-entities/src/api/index.ts @@ -68,7 +68,13 @@ export interface CatalogUnprocessedEntitiesApi { export class CatalogUnprocessedEntitiesClient implements CatalogUnprocessedEntitiesApi { - constructor(public discovery: DiscoveryApi, public fetchApi: FetchApi) {} + public discovery: DiscoveryApi; + public fetchApi: FetchApi; + + constructor(discovery: DiscoveryApi, fetchApi: FetchApi) { + this.discovery = discovery; + this.fetchApi = fetchApi; + } private async fetch(path: string, init?: RequestInit): Promise { const url = await this.discovery.getBaseUrl('catalog'); diff --git a/plugins/devtools-backend/src/api/DevToolsBackendApi.ts b/plugins/devtools-backend/src/api/DevToolsBackendApi.ts index 5ecc3327e0..21eedf7b0b 100644 --- a/plugins/devtools-backend/src/api/DevToolsBackendApi.ts +++ b/plugins/devtools-backend/src/api/DevToolsBackendApi.ts @@ -37,10 +37,13 @@ import { LoggerService } from '@backstage/backend-plugin-api'; /** @public */ export class DevToolsBackendApi { - public constructor( - private readonly logger: LoggerService, - private readonly config: Config, - ) {} + private readonly logger: LoggerService; + private readonly config: Config; + + public constructor(logger: LoggerService, config: Config) { + this.logger = logger; + this.config = config; + } public async listExternalDependencyDetails(): Promise { const result: ExternalDependency[] = []; diff --git a/plugins/devtools-backend/src/util/Lockfile.ts b/plugins/devtools-backend/src/util/Lockfile.ts index 7f5497e948..78ee788c43 100644 --- a/plugins/devtools-backend/src/util/Lockfile.ts +++ b/plugins/devtools-backend/src/util/Lockfile.ts @@ -108,11 +108,19 @@ export class Lockfile { return new Lockfile(packages, data, legacy); } + private readonly packages: Map; + private readonly data: LockfileData; + private readonly legacy: boolean; + private constructor( - private readonly packages: Map, - private readonly data: LockfileData, - private readonly legacy: boolean = false, - ) {} + packages: Map, + data: LockfileData, + legacy: boolean = false, + ) { + this.packages = packages; + this.data = data; + this.legacy = legacy; + } /** Get the entries for a single package in the lockfile */ get(name: string): LockfileQueryEntry[] | undefined { diff --git a/plugins/events-backend-module-aws-sqs/src/publisher/AwsSqsConsumingEventPublisher.ts b/plugins/events-backend-module-aws-sqs/src/publisher/AwsSqsConsumingEventPublisher.ts index c7628ffb20..0776a39af9 100644 --- a/plugins/events-backend-module-aws-sqs/src/publisher/AwsSqsConsumingEventPublisher.ts +++ b/plugins/events-backend-module-aws-sqs/src/publisher/AwsSqsConsumingEventPublisher.ts @@ -59,12 +59,19 @@ export class AwsSqsConsumingEventPublisher { ); } + private readonly logger: LoggerService; + private readonly events: EventsService; + private readonly scheduler: SchedulerService; + private constructor( - private readonly logger: LoggerService, - private readonly events: EventsService, - private readonly scheduler: SchedulerService, + logger: LoggerService, + events: EventsService, + scheduler: SchedulerService, config: AwsSqsEventSourceConfig, ) { + this.logger = logger; + this.events = events; + this.scheduler = scheduler; this.topic = config.topic; this.receiveParams = { diff --git a/plugins/events-backend-module-kafka/src/publisher/KafkaConsumingEventPublisher.ts b/plugins/events-backend-module-kafka/src/publisher/KafkaConsumingEventPublisher.ts index f730696abe..dfc6186fb5 100644 --- a/plugins/events-backend-module-kafka/src/publisher/KafkaConsumingEventPublisher.ts +++ b/plugins/events-backend-module-kafka/src/publisher/KafkaConsumingEventPublisher.ts @@ -44,12 +44,15 @@ export class KafkaConsumingEventPublisher { ); } + private readonly events: EventsService; + private constructor( kafkaClient: Kafka, logger: LoggerService, - private readonly events: EventsService, + events: EventsService, config: KafkaConsumerConfig, ) { + this.events = events; this.kafkaConsumer = kafkaClient.consumer(config.consumerConfig); this.consumerSubscribeTopics = config.consumerSubscribeTopics; this.backstageTopic = config.backstageTopic; diff --git a/plugins/events-backend/src/service/EventsPlugin.test.ts b/plugins/events-backend/src/service/EventsPlugin.test.ts index 2c3fb3b909..549925cf01 100644 --- a/plugins/events-backend/src/service/EventsPlugin.test.ts +++ b/plugins/events-backend/src/service/EventsPlugin.test.ts @@ -108,7 +108,11 @@ describe('eventsPlugin', () => { describe('event bus', () => { class ReqHelper { - constructor(private readonly backend: TestBackend) {} + private readonly backend: TestBackend; + + constructor(backend: TestBackend) { + this.backend = backend; + } subscribe(id: string, topics: string[], options?: { auth?: string }) { return request(this.backend.server) diff --git a/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.ts b/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.ts index 8ac6542e81..ef9ceb9240 100644 --- a/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.ts +++ b/plugins/events-backend/src/service/http/HttpPostIngressEventPublisher.ts @@ -65,16 +65,30 @@ export class HttpPostIngressEventPublisher { ); } + private readonly events: EventsService; + private readonly logger: LoggerService; + private readonly ingresses: { + [topic: string]: Omit; + }; + private readonly bodyParsers: { + [contentType: string]: HttpBodyParser; + }; + private constructor( - private readonly events: EventsService, - private readonly logger: LoggerService, - private readonly ingresses: { + events: EventsService, + logger: LoggerService, + ingresses: { [topic: string]: Omit; }, - private readonly bodyParsers: { + bodyParsers: { [contentType: string]: HttpBodyParser; }, - ) {} + ) { + this.events = events; + this.logger = logger; + this.ingresses = ingresses; + this.bodyParsers = bodyParsers; + } bind(router: express.Router): void { router.use('/http', this.createRouter(this.ingresses)); diff --git a/plugins/events-node/src/api/DefaultEventsService.ts b/plugins/events-node/src/api/DefaultEventsService.ts index 3ceed45a26..bc593b22dd 100644 --- a/plugins/events-node/src/api/DefaultEventsService.ts +++ b/plugins/events-node/src/api/DefaultEventsService.ts @@ -115,14 +115,28 @@ export class LocalEventBus { * events backend if it is available. */ class PluginEventsService implements EventsService { + private readonly pluginId: string; + private readonly localBus: LocalEventBus; + private readonly logger: LoggerService; + private readonly mode: EventBusMode; + private client?: DefaultApiClient; + private readonly auth?: AuthService; + constructor( - private readonly pluginId: string, - private readonly localBus: LocalEventBus, - private readonly logger: LoggerService, - private readonly mode: EventBusMode, - private client?: DefaultApiClient, - private readonly auth?: AuthService, - ) {} + pluginId: string, + localBus: LocalEventBus, + logger: LoggerService, + mode: EventBusMode, + client?: DefaultApiClient, + auth?: AuthService, + ) { + this.pluginId = pluginId; + this.localBus = localBus; + this.logger = logger; + this.mode = mode; + this.client = client; + this.auth = auth; + } async publish(params: EventParams): Promise { const lock = this.#getShutdownLock(); @@ -382,11 +396,19 @@ class PluginEventsService implements EventsService { */ // TODO(pjungermann): add opentelemetry? (see plugins/catalog-backend/src/util/opentelemetry.ts, etc.) export class DefaultEventsService implements EventsService { + private readonly logger: LoggerService; + private readonly localBus: LocalEventBus; + private readonly mode: EventBusMode; + private constructor( - private readonly logger: LoggerService, - private readonly localBus: LocalEventBus, - private readonly mode: EventBusMode, - ) {} + logger: LoggerService, + localBus: LocalEventBus, + mode: EventBusMode, + ) { + this.logger = logger; + this.localBus = localBus; + this.mode = mode; + } static create(options: { logger: LoggerService; diff --git a/plugins/kubernetes-backend/src/auth/AzureIdentityStrategy.test.ts b/plugins/kubernetes-backend/src/auth/AzureIdentityStrategy.test.ts index 3317071893..23ad31e2d2 100644 --- a/plugins/kubernetes-backend/src/auth/AzureIdentityStrategy.test.ts +++ b/plugins/kubernetes-backend/src/auth/AzureIdentityStrategy.test.ts @@ -22,8 +22,11 @@ const logger = mockServices.logger.mock(); class StaticTokenCredential implements TokenCredential { private count: number = 0; + private expiryInMs: number; - constructor(private expiryInMs: number) {} + constructor(expiryInMs: number) { + this.expiryInMs = expiryInMs; + } getToken(): Promise { this.count++; diff --git a/plugins/kubernetes-backend/src/auth/AzureIdentityStrategy.ts b/plugins/kubernetes-backend/src/auth/AzureIdentityStrategy.ts index 1c6b4b81ea..aa8713296a 100644 --- a/plugins/kubernetes-backend/src/auth/AzureIdentityStrategy.ts +++ b/plugins/kubernetes-backend/src/auth/AzureIdentityStrategy.ts @@ -36,10 +36,16 @@ export class AzureIdentityStrategy implements AuthenticationStrategy { private accessToken: AccessToken = { token: '', expiresOnTimestamp: 0 }; private newTokenPromise: Promise | undefined; + private readonly logger: LoggerService; + private readonly tokenCredential: TokenCredential; + constructor( - private readonly logger: LoggerService, - private readonly tokenCredential: TokenCredential = new DefaultAzureCredential(), - ) {} + logger: LoggerService, + tokenCredential: TokenCredential = new DefaultAzureCredential(), + ) { + this.logger = logger; + this.tokenCredential = tokenCredential; + } public async getCredential(): Promise { if (!this.tokenRequiresRefresh()) { diff --git a/plugins/kubernetes-backend/src/cluster-locator/GkeClusterLocator.ts b/plugins/kubernetes-backend/src/cluster-locator/GkeClusterLocator.ts index ed95b59217..2022d5f14a 100644 --- a/plugins/kubernetes-backend/src/cluster-locator/GkeClusterLocator.ts +++ b/plugins/kubernetes-backend/src/cluster-locator/GkeClusterLocator.ts @@ -42,12 +42,22 @@ type GkeClusterLocatorOptions = { }; export class GkeClusterLocator implements KubernetesClustersSupplier { + private readonly options: GkeClusterLocatorOptions; + private readonly client: container.v1.ClusterManagerClient; + private clusterDetails: ClusterDetails[] | undefined; + private hasClusterDetails: boolean; + constructor( - private readonly options: GkeClusterLocatorOptions, - private readonly client: container.v1.ClusterManagerClient, - private clusterDetails: ClusterDetails[] | undefined = undefined, - private hasClusterDetails: boolean = false, - ) {} + options: GkeClusterLocatorOptions, + client: container.v1.ClusterManagerClient, + clusterDetails: ClusterDetails[] | undefined = undefined, + hasClusterDetails: boolean = false, + ) { + this.options = options; + this.client = client; + this.clusterDetails = clusterDetails; + this.hasClusterDetails = hasClusterDetails; + } static fromConfigWithClient( config: Config, diff --git a/plugins/kubernetes-backend/src/cluster-locator/index.ts b/plugins/kubernetes-backend/src/cluster-locator/index.ts index 68e3e81209..c18ff035e7 100644 --- a/plugins/kubernetes-backend/src/cluster-locator/index.ts +++ b/plugins/kubernetes-backend/src/cluster-locator/index.ts @@ -33,10 +33,16 @@ import { import { CatalogService } from '@backstage/plugin-catalog-node'; class CombinedClustersSupplier implements KubernetesClustersSupplier { + readonly clusterSuppliers: KubernetesClustersSupplier[]; + readonly logger: LoggerService; + constructor( - readonly clusterSuppliers: KubernetesClustersSupplier[], - readonly logger: LoggerService, - ) {} + clusterSuppliers: KubernetesClustersSupplier[], + logger: LoggerService, + ) { + this.clusterSuppliers = clusterSuppliers; + this.logger = logger; + } async getClusters(options: { credentials: BackstageCredentials; diff --git a/plugins/kubernetes-backend/src/service/KubernetesInitializer.ts b/plugins/kubernetes-backend/src/service/KubernetesInitializer.ts index 1b0b9a31e1..46ce5fa888 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesInitializer.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesInitializer.ts @@ -45,32 +45,26 @@ import { KubernetesFanOutHandler, } from './KubernetesFanOutHandler'; -export class KubernetesInitializer { - constructor( - private readonly opts: { - fetcher?: KubernetesFetcherFactory; - authStrategyMap?: Map; - clusterSupplier?: KubernetesClusterSupplierFactory; - logger: LoggerService; - config: RootConfigService; - catalog: CatalogService; - auth: AuthService; - serviceLocator?: KubernetesServiceLocatorFactory; - objectsProvider?: KubernetesObjectsProviderFactory; - }, - ) {} +type Opts = { + fetcher?: KubernetesFetcherFactory; + clusterSupplier?: KubernetesClusterSupplierFactory; + serviceLocator?: KubernetesServiceLocatorFactory; + objectsProvider?: KubernetesObjectsProviderFactory; + authStrategyMap?: Map; + logger: LoggerService; + config: RootConfigService; + catalog: CatalogService; + auth: AuthService; +}; - static create(opts: { - fetcher?: KubernetesFetcherFactory; - clusterSupplier?: KubernetesClusterSupplierFactory; - serviceLocator?: KubernetesServiceLocatorFactory; - objectsProvider?: KubernetesObjectsProviderFactory; - authStrategyMap?: Map; - logger: LoggerService; - config: RootConfigService; - catalog: CatalogService; - auth: AuthService; - }) { +export class KubernetesInitializer { + private readonly opts: Opts; + + constructor(opts: Opts) { + this.opts = opts; + } + + static create(opts: Opts) { return new KubernetesInitializer(opts); } diff --git a/plugins/kubernetes-backend/src/service/KubernetesRouter.ts b/plugins/kubernetes-backend/src/service/KubernetesRouter.ts index 5a5518670e..589e75a172 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesRouter.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesRouter.ts @@ -69,7 +69,11 @@ export class KubernetesRouter { return new KubernetesRouter(env); } - constructor(protected readonly env: KubernetesEnvironment) {} + protected readonly env: KubernetesEnvironment; + + constructor(env: KubernetesEnvironment) { + this.env = env; + } public async getRouter() { const { diff --git a/plugins/kubernetes-node/src/auth/PinnipedHelper.ts b/plugins/kubernetes-node/src/auth/PinnipedHelper.ts index d6c39d55de..9556e87c85 100644 --- a/plugins/kubernetes-node/src/auth/PinnipedHelper.ts +++ b/plugins/kubernetes-node/src/auth/PinnipedHelper.ts @@ -50,7 +50,11 @@ export type PinnipedParameters = { * @public */ export class PinnipedHelper { - constructor(private readonly logger: LoggerService) {} + private readonly logger: LoggerService; + + constructor(logger: LoggerService) { + this.logger = logger; + } public async tokenCredentialRequest( clusterDetails: ClusterDetails, diff --git a/plugins/kubernetes-react/src/api/formatters/GkeClusterLinksFormatter.ts b/plugins/kubernetes-react/src/api/formatters/GkeClusterLinksFormatter.ts index 4bf3c28f45..13f1bad5b1 100644 --- a/plugins/kubernetes-react/src/api/formatters/GkeClusterLinksFormatter.ts +++ b/plugins/kubernetes-react/src/api/formatters/GkeClusterLinksFormatter.ts @@ -29,7 +29,11 @@ const kindMappings: Record = { /** @public */ export class GkeClusterLinksFormatter implements ClusterLinksFormatter { - constructor(private readonly googleAuthApi: ProfileInfoApi | undefined) {} + private readonly googleAuthApi: ProfileInfoApi | undefined; + + constructor(googleAuthApi: ProfileInfoApi | undefined) { + this.googleAuthApi = googleAuthApi; + } async formatClusterLink(options: ClusterLinksFormatterOptions): Promise { if (!options.dashboardParameters) { throw new Error('GKE dashboard requires a dashboardParameters option'); diff --git a/plugins/kubernetes-react/src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts b/plugins/kubernetes-react/src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts index 34a83dfed3..a73f32f43c 100644 --- a/plugins/kubernetes-react/src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts +++ b/plugins/kubernetes-react/src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts @@ -19,7 +19,11 @@ import { KubernetesAuthProvider } from './types'; /** @public */ export class AksKubernetesAuthProvider implements KubernetesAuthProvider { - constructor(private readonly microsoftAuthApi: OAuthApi) {} + private readonly microsoftAuthApi: OAuthApi; + + constructor(microsoftAuthApi: OAuthApi) { + this.microsoftAuthApi = microsoftAuthApi; + } async decorateRequestBodyForAuth( requestBody: KubernetesRequestBody, diff --git a/plugins/kubernetes-react/src/kubernetes-auth-provider/KubernetesAuthProviders.test.ts b/plugins/kubernetes-react/src/kubernetes-auth-provider/KubernetesAuthProviders.test.ts index 2fdd3d9d2c..79441caaaa 100644 --- a/plugins/kubernetes-react/src/kubernetes-auth-provider/KubernetesAuthProviders.test.ts +++ b/plugins/kubernetes-react/src/kubernetes-auth-provider/KubernetesAuthProviders.test.ts @@ -19,7 +19,11 @@ import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; import { KubernetesAuthProviders } from './KubernetesAuthProviders'; class MockAuthApi implements OAuthApi, OpenIdConnectApi { - constructor(private readonly token: string) {} + private readonly token: string; + + constructor(token: string) { + this.token = token; + } getAccessToken = jest.fn(async () => { return this.token; diff --git a/plugins/mcp-actions-backend/src/services/McpService.ts b/plugins/mcp-actions-backend/src/services/McpService.ts index f308395aac..c6cdf901d7 100644 --- a/plugins/mcp-actions-backend/src/services/McpService.ts +++ b/plugins/mcp-actions-backend/src/services/McpService.ts @@ -27,7 +27,11 @@ import { NotFoundError } from '@backstage/errors'; import { handleErrors } from './handleErrors'; export class McpService { - constructor(private readonly actions: ActionsService) {} + private readonly actions: ActionsService; + + constructor(actions: ActionsService) { + this.actions = actions; + } static async create({ actions }: { actions: ActionsService }) { return new McpService(actions); diff --git a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts index 39a0c5da02..eadfe7747e 100644 --- a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts +++ b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts @@ -61,14 +61,27 @@ export class NotificationsEmailProcessor implements NotificationProcessor { private readonly allowlistEmailAddresses?: string[]; private readonly denylistEmailAddresses?: string[]; + private readonly logger: LoggerService; + private readonly config: Config; + private readonly catalog: CatalogService; + private readonly auth: AuthService; + private readonly cache?: CacheService; + private readonly templateRenderer?: NotificationTemplateRenderer; + constructor( - private readonly logger: LoggerService, - private readonly config: Config, - private readonly catalog: CatalogService, - private readonly auth: AuthService, - private readonly cache?: CacheService, - private readonly templateRenderer?: NotificationTemplateRenderer, + logger: LoggerService, + config: Config, + catalog: CatalogService, + auth: AuthService, + cache?: CacheService, + templateRenderer?: NotificationTemplateRenderer, ) { + this.logger = logger; + this.config = config; + this.catalog = catalog; + this.auth = auth; + this.cache = cache; + this.templateRenderer = templateRenderer; const emailProcessorConfig = config.getConfig( 'notifications.processors.email', ); diff --git a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts index 94131ca257..9e49b1b0cd 100644 --- a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts +++ b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts @@ -121,7 +121,10 @@ export const generateSettingsHash = ( export class DatabaseNotificationsStore implements NotificationsStore { private readonly isSQLite = false; - private constructor(private readonly db: Knex) { + private readonly db: Knex; + + private constructor(db: Knex) { + this.db = db; this.isSQLite = this.db.client.config.client.includes('sqlite3'); } diff --git a/plugins/notifications-backend/src/service/DefaultNotificationRecipientResolver.ts b/plugins/notifications-backend/src/service/DefaultNotificationRecipientResolver.ts index 200b5dc4ea..7ca8385bd3 100644 --- a/plugins/notifications-backend/src/service/DefaultNotificationRecipientResolver.ts +++ b/plugins/notifications-backend/src/service/DefaultNotificationRecipientResolver.ts @@ -47,10 +47,13 @@ const partitionEntityRefs = (refs: string[]): string[][] => { export class DefaultNotificationRecipientResolver implements NotificationRecipientResolver { - constructor( - private readonly auth: AuthService, - private readonly catalog: CatalogService, - ) {} + private readonly auth: AuthService; + private readonly catalog: CatalogService; + + constructor(auth: AuthService, catalog: CatalogService) { + this.auth = auth; + this.catalog = catalog; + } async resolveNotificationRecipients(options: { entityRefs: string[]; diff --git a/plugins/notifications-backend/src/service/NotificationCleaner.ts b/plugins/notifications-backend/src/service/NotificationCleaner.ts index 6733a843b5..984fc95450 100644 --- a/plugins/notifications-backend/src/service/NotificationCleaner.ts +++ b/plugins/notifications-backend/src/service/NotificationCleaner.ts @@ -26,13 +26,19 @@ import { ForwardedError } from '@backstage/errors'; export class NotificationCleaner { private readonly retention: HumanDuration = { years: 1 }; private readonly enabled: boolean = true; + private readonly scheduler: SchedulerService; + private readonly logger: LoggerService; + private readonly database: NotificationsStore; constructor( config: Config, - private readonly scheduler: SchedulerService, - private readonly logger: LoggerService, - private readonly database: NotificationsStore, + scheduler: SchedulerService, + logger: LoggerService, + database: NotificationsStore, ) { + this.scheduler = scheduler; + this.logger = logger; + this.database = database; if (config.has('notifications.retention')) { const retentionConfig = config.get('notifications.retention'); if (typeof retentionConfig === 'boolean' && !retentionConfig) { diff --git a/plugins/notifications-node/src/service/DefaultNotificationService.ts b/plugins/notifications-node/src/service/DefaultNotificationService.ts index 8ea58f22d3..8b4948047c 100644 --- a/plugins/notifications-node/src/service/DefaultNotificationService.ts +++ b/plugins/notifications-node/src/service/DefaultNotificationService.ts @@ -49,10 +49,13 @@ export type NotificationSendOptions = { /** @public */ export class DefaultNotificationService implements NotificationService { - private constructor( - private readonly discovery: DiscoveryService, - private readonly auth: AuthService, - ) {} + private readonly discovery: DiscoveryService; + private readonly auth: AuthService; + + private constructor(discovery: DiscoveryService, auth: AuthService) { + this.discovery = discovery; + this.auth = auth; + } static create( options: NotificationServiceOptions, diff --git a/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts b/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts index a36dadd2b5..ece99f08c7 100644 --- a/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts +++ b/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts @@ -292,7 +292,7 @@ describe('PermissionIntegrationClient', () => { createPermissionRule({ name: 'RULE_1', description: 'Test rule 1', - resourceType: 'test-resource', + resourceType: 'test-resource' as const, paramsSchema: z.object({ input: z.enum(['yes', 'no']), }), @@ -304,7 +304,7 @@ describe('PermissionIntegrationClient', () => { createPermissionRule({ name: 'RULE_2', description: 'Test rule 2', - resourceType: 'test-resource', + resourceType: 'test-resource' as const, paramsSchema: z.object({ input: z.enum(['yes', 'no']), diff --git a/plugins/permission-node/src/integration/createConditionExports.test.ts b/plugins/permission-node/src/integration/createConditionExports.test.ts index dad57e2b8b..926e607baa 100644 --- a/plugins/permission-node/src/integration/createConditionExports.test.ts +++ b/plugins/permission-node/src/integration/createConditionExports.test.ts @@ -21,11 +21,14 @@ import { import { z } from 'zod'; import { createConditionExports } from './createConditionExports'; import { createPermissionRule } from './createPermissionRule'; +import { createPermissionResourceRef } from './createPermissionResourceRef'; const testIntegration = () => createConditionExports({ - pluginId: 'test-plugin', - resourceType: 'test-resource', + resourceRef: createPermissionResourceRef().with({ + pluginId: 'test-plugin', + resourceType: 'test-resource', + }), rules: { testRule1: createPermissionRule({ name: 'testRule1', diff --git a/plugins/permission-react/src/apis/IdentityPermissionApi.ts b/plugins/permission-react/src/apis/IdentityPermissionApi.ts index 1fe295c9f2..dc1fc3b5a3 100644 --- a/plugins/permission-react/src/apis/IdentityPermissionApi.ts +++ b/plugins/permission-react/src/apis/IdentityPermissionApi.ts @@ -29,10 +29,16 @@ import { Config } from '@backstage/config'; * @public */ export class IdentityPermissionApi implements PermissionApi { + private readonly permissionClient: PermissionClient; + private readonly identityApi: IdentityApi; + private constructor( - private readonly permissionClient: PermissionClient, - private readonly identityApi: IdentityApi, - ) {} + permissionClient: PermissionClient, + identityApi: IdentityApi, + ) { + this.permissionClient = permissionClient; + this.identityApi = identityApi; + } static create(options: { config: Config; diff --git a/plugins/scaffolder-backend-module-gcp/src/providers/GcpBucketWorkspaceProvider.ts b/plugins/scaffolder-backend-module-gcp/src/providers/GcpBucketWorkspaceProvider.ts index 3529073648..18552a3be6 100644 --- a/plugins/scaffolder-backend-module-gcp/src/providers/GcpBucketWorkspaceProvider.ts +++ b/plugins/scaffolder-backend-module-gcp/src/providers/GcpBucketWorkspaceProvider.ts @@ -27,15 +27,23 @@ import { } from '@backstage/plugin-scaffolder-node/alpha'; export class GcpBucketWorkspaceProvider implements WorkspaceProvider { + private readonly storage: Storage; + private readonly logger: LoggerService; + private readonly config?: Config; + static create(logger: LoggerService, config?: Config) { return new GcpBucketWorkspaceProvider(new Storage(), logger, config); } private constructor( - private readonly storage: Storage, - private readonly logger: LoggerService, - private readonly config?: Config, - ) {} + storage: Storage, + logger: LoggerService, + config?: Config, + ) { + this.storage = storage; + this.logger = logger; + this.config = config; + } public async cleanWorkspace(options: { taskId: string }): Promise { const file = this.storage diff --git a/plugins/scaffolder-backend/src/scaffolder/dryrun/DecoratedActionsRegistry.ts b/plugins/scaffolder-backend/src/scaffolder/dryrun/DecoratedActionsRegistry.ts index edbe28a0f5..4d16369f87 100644 --- a/plugins/scaffolder-backend/src/scaffolder/dryrun/DecoratedActionsRegistry.ts +++ b/plugins/scaffolder-backend/src/scaffolder/dryrun/DecoratedActionsRegistry.ts @@ -21,11 +21,13 @@ import { BackstageCredentials } from '@backstage/backend-plugin-api'; /** @internal */ export class DecoratedActionsRegistry implements TemplateActionRegistry { private readonly innerActions: Map = new Map(); + private readonly innerRegistry: TemplateActionRegistry; constructor( - private readonly innerRegistry: TemplateActionRegistry, + innerRegistry: TemplateActionRegistry, extraActions: Array, ) { + this.innerRegistry = innerRegistry; for (const action of extraActions) { this.innerActions.set(action.id, action); } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseWorkspaceProvider.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseWorkspaceProvider.ts index b3c3c24975..6018c0f246 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseWorkspaceProvider.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseWorkspaceProvider.ts @@ -19,11 +19,15 @@ import { TaskStore } from './types'; import { WorkspaceProvider } from '@backstage/plugin-scaffolder-node/alpha'; export class DatabaseWorkspaceProvider implements WorkspaceProvider { + private readonly storage: TaskStore; + static create(storage: TaskStore) { return new DatabaseWorkspaceProvider(storage); } - private constructor(private readonly storage: TaskStore) {} + private constructor(storage: TaskStore) { + this.storage = storage; + } public async serializeWorkspace(options: { path: string; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 4d070daa52..e2e36438a1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -128,8 +128,10 @@ const isActionAuthorized = createConditionAuthorizer( export class NunjucksWorkflowRunner implements WorkflowRunner { private readonly defaultTemplateFilters: Record; + private readonly options: NunjucksWorkflowRunnerOptions; - constructor(private readonly options: NunjucksWorkflowRunnerOptions) { + constructor(options: NunjucksWorkflowRunnerOptions) { + this.options = options; this.defaultTemplateFilters = convertFiltersToRecord( createDefaultFilters({ integrations: this.options.integrations, diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index 2c2c176770..7ee7759d5c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -84,15 +84,29 @@ export class TaskManager implements TaskContext { return agent; } + private readonly task: CurrentClaimedTask; + private readonly storage: TaskStore; + private readonly signal: AbortSignal; + private readonly logger: LoggerService; + private readonly workspaceService: WorkspaceService; + private readonly auth?: AuthService; + // Runs heartbeat internally private constructor( - private readonly task: CurrentClaimedTask, - private readonly storage: TaskStore, - private readonly signal: AbortSignal, - private readonly logger: LoggerService, - private readonly workspaceService: WorkspaceService, - private readonly auth?: AuthService, - ) {} + task: CurrentClaimedTask, + storage: TaskStore, + signal: AbortSignal, + logger: LoggerService, + workspaceService: WorkspaceService, + auth?: AuthService, + ) { + this.task = task; + this.storage = storage; + this.signal = signal; + this.logger = logger; + this.workspaceService = workspaceService; + this.auth = auth; + } get taskId() { return this.task.taskId; @@ -249,17 +263,31 @@ export interface CurrentClaimedTask { } export class StorageTaskBroker implements TaskBroker { + private readonly storage: TaskStore; + private readonly logger: LoggerService; + private readonly config?: Config; + private readonly auth?: AuthService; + private readonly additionalWorkspaceProviders?: Record< + string, + WorkspaceProvider + >; + private readonly auditor?: AuditorService; + constructor( - private readonly storage: TaskStore, - private readonly logger: LoggerService, - private readonly config?: Config, - private readonly auth?: AuthService, - private readonly additionalWorkspaceProviders?: Record< - string, - WorkspaceProvider - >, - private readonly auditor?: AuditorService, - ) {} + storage: TaskStore, + logger: LoggerService, + config?: Config, + auth?: AuthService, + additionalWorkspaceProviders?: Record, + auditor?: AuditorService, + ) { + this.storage = storage; + this.logger = logger; + this.config = config; + this.auth = auth; + this.additionalWorkspaceProviders = additionalWorkspaceProviders; + this.auditor = auditor; + } async list(options?: { createdBy?: string; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index adfdf0b553..3a15b345db 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -90,11 +90,16 @@ export class TaskWorker { private parameterAuditTransform: ParameterAuditTransform; private stopWorkers: boolean; + private readonly options: TaskWorkerOptions & { + parameterAuditTransform: ParameterAuditTransform; + }; + private constructor( - private readonly options: TaskWorkerOptions & { + options: TaskWorkerOptions & { parameterAuditTransform: ParameterAuditTransform; }, ) { + this.options = options; this.stopWorkers = false; this.logger = options.logger; this.auditor = options.auditor; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/WorkspaceService.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/WorkspaceService.ts index bb3ce448fc..ecdad02560 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/WorkspaceService.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/WorkspaceService.ts @@ -49,11 +49,19 @@ export class DefaultWorkspaceService implements WorkspaceService { return new DefaultWorkspaceService(task, workspaceProvider, config); } + private readonly task: CurrentClaimedTask; + private readonly workspaceProvider: WorkspaceProvider; + private readonly config?: Config; + private constructor( - private readonly task: CurrentClaimedTask, - private readonly workspaceProvider: WorkspaceProvider, - private readonly config?: Config, - ) {} + task: CurrentClaimedTask, + workspaceProvider: WorkspaceProvider, + config?: Config, + ) { + this.task = task; + this.workspaceProvider = workspaceProvider; + this.config = config; + } public async serializeWorkspace(options: { path: string }): Promise { if (this.isWorkspaceSerializationEnabled()) { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts index da309b37ff..6ca24663b6 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts @@ -44,13 +44,20 @@ interface WinstonLoggerOptions { // This is a workaround for being able to preserve the log format of the root logger. // Will revisit all of this implementation once we can break the router to use only `LoggerService`. export class BackstageLoggerTransport extends Transport { + private readonly backstageLogger: LoggerService; + private readonly taskContext: TaskContext; + private readonly stepId: string; + constructor( - private readonly backstageLogger: LoggerService, - private readonly taskContext: TaskContext, - private readonly stepId: string, + backstageLogger: LoggerService, + taskContext: TaskContext, + stepId: string, opts?: TransportStreamOptions, ) { super(opts); + this.backstageLogger = backstageLogger; + this.taskContext = taskContext; + this.stepId = stepId; } log(info: TransformableInfo, callback: VoidFunction) { diff --git a/plugins/scaffolder-backend/src/util/loggerToWinstonLogger.ts b/plugins/scaffolder-backend/src/util/loggerToWinstonLogger.ts index ff76549ec3..f1cbe70b4b 100644 --- a/plugins/scaffolder-backend/src/util/loggerToWinstonLogger.ts +++ b/plugins/scaffolder-backend/src/util/loggerToWinstonLogger.ts @@ -20,11 +20,11 @@ import { Logger as WinstonLogger, createLogger } from 'winston'; import Transport, { TransportStreamOptions } from 'winston-transport'; class BackstageLoggerTransport extends Transport { - constructor( - private readonly backstageLogger: LoggerService, - opts?: TransportStreamOptions, - ) { + private readonly backstageLogger: LoggerService; + + constructor(backstageLogger: LoggerService, opts?: TransportStreamOptions) { super(opts); + this.backstageLogger = backstageLogger; } log(info: unknown, callback: VoidFunction) { diff --git a/plugins/scaffolder-node-test-utils/src/actions/loggerToWinstonLogger.ts b/plugins/scaffolder-node-test-utils/src/actions/loggerToWinstonLogger.ts index ff76549ec3..f1cbe70b4b 100644 --- a/plugins/scaffolder-node-test-utils/src/actions/loggerToWinstonLogger.ts +++ b/plugins/scaffolder-node-test-utils/src/actions/loggerToWinstonLogger.ts @@ -20,11 +20,11 @@ import { Logger as WinstonLogger, createLogger } from 'winston'; import Transport, { TransportStreamOptions } from 'winston-transport'; class BackstageLoggerTransport extends Transport { - constructor( - private readonly backstageLogger: LoggerService, - opts?: TransportStreamOptions, - ) { + private readonly backstageLogger: LoggerService; + + constructor(backstageLogger: LoggerService, opts?: TransportStreamOptions) { super(opts); + this.backstageLogger = backstageLogger; } log(info: unknown, callback: VoidFunction) { diff --git a/plugins/scaffolder-node/src/actions/loggerToWinstonLogger.ts b/plugins/scaffolder-node/src/actions/loggerToWinstonLogger.ts index ff76549ec3..f1cbe70b4b 100644 --- a/plugins/scaffolder-node/src/actions/loggerToWinstonLogger.ts +++ b/plugins/scaffolder-node/src/actions/loggerToWinstonLogger.ts @@ -20,11 +20,11 @@ import { Logger as WinstonLogger, createLogger } from 'winston'; import Transport, { TransportStreamOptions } from 'winston-transport'; class BackstageLoggerTransport extends Transport { - constructor( - private readonly backstageLogger: LoggerService, - opts?: TransportStreamOptions, - ) { + private readonly backstageLogger: LoggerService; + + constructor(backstageLogger: LoggerService, opts?: TransportStreamOptions) { super(opts); + this.backstageLogger = backstageLogger; } log(info: unknown, callback: VoidFunction) { diff --git a/plugins/scaffolder-node/src/scm/git.ts b/plugins/scaffolder-node/src/scm/git.ts index 42926fd901..b05907582c 100644 --- a/plugins/scaffolder-node/src/scm/git.ts +++ b/plugins/scaffolder-node/src/scm/git.ts @@ -79,13 +79,18 @@ export class Git { [x: string]: string; }; - private constructor( - private readonly config: { - onAuth: AuthCallback; - token?: string; - logger?: LoggerService; - }, - ) { + private readonly config: { + onAuth: AuthCallback; + token?: string; + logger?: LoggerService; + }; + + private constructor(config: { + onAuth: AuthCallback; + token?: string; + logger?: LoggerService; + }) { + this.config = config; this.onAuth = config.onAuth; this.headers = { diff --git a/plugins/scaffolder-react/src/next/api/FormFieldsApi.ts b/plugins/scaffolder-react/src/next/api/FormFieldsApi.ts index d01b4e37b9..08ccc662d4 100644 --- a/plugins/scaffolder-react/src/next/api/FormFieldsApi.ts +++ b/plugins/scaffolder-react/src/next/api/FormFieldsApi.ts @@ -24,9 +24,11 @@ import { FormFieldBlueprint } from '../blueprints'; import { OpaqueFormField } from '@internal/scaffolder'; class DefaultScaffolderFormFieldsApi implements ScaffolderFormFieldsApi { - constructor( - private readonly formFieldLoaders: Array<() => Promise> = [], - ) {} + private readonly formFieldLoaders: Array<() => Promise>; + + constructor(formFieldLoaders: Array<() => Promise> = []) { + this.formFieldLoaders = formFieldLoaders; + } async getFormFields() { const formFields = await Promise.all( diff --git a/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts b/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts index 63807f54ef..fc15078055 100644 --- a/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts +++ b/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts @@ -27,11 +27,13 @@ import { FormDecoratorBlueprint } from '@backstage/plugin-scaffolder-react/alpha export class DefaultScaffolderFormDecoratorsApi implements ScaffolderFormDecoratorsApi { - private constructor( - private readonly options: { - decorators: Array; - }, - ) {} + private readonly options: { + decorators: Array; + }; + + private constructor(options: { decorators: Array }) { + this.options = options; + } static create(options?: { decorators: ScaffolderFormDecorator[] }) { return new DefaultScaffolderFormDecoratorsApi( diff --git a/plugins/scaffolder/src/alpha/components/TemplateEditorPage/DryRunContext.test.tsx b/plugins/scaffolder/src/alpha/components/TemplateEditorPage/DryRunContext.test.tsx index 5f2187f083..9b4bdb9032 100644 --- a/plugins/scaffolder/src/alpha/components/TemplateEditorPage/DryRunContext.test.tsx +++ b/plugins/scaffolder/src/alpha/components/TemplateEditorPage/DryRunContext.test.tsx @@ -32,7 +32,7 @@ import { renderHook } from '@testing-library/react'; import { PropsWithChildren } from 'react'; import { formDecoratorsApiRef } from '../../api'; -window.TextEncoder = TextEncoder; +window.TextEncoder = TextEncoder as any; describe('base64EncodeContent', () => { it('encodes text files', () => { diff --git a/plugins/scaffolder/src/lib/filesystem/MockFileSystemAccess.ts b/plugins/scaffolder/src/lib/filesystem/MockFileSystemAccess.ts index c84d557a2e..20e048d5f7 100644 --- a/plugins/scaffolder/src/lib/filesystem/MockFileSystemAccess.ts +++ b/plugins/scaffolder/src/lib/filesystem/MockFileSystemAccess.ts @@ -17,7 +17,13 @@ import { TemplateDirectoryAccess, TemplateFileAccess } from './types'; class MockFileAccess implements TemplateFileAccess { - constructor(readonly path: string, private content: string) {} + readonly path: string; + private content: string; + + constructor(path: string, content: string) { + this.path = path; + this.content = content; + } async file(): Promise { const blob = new Blob([this.content]); diff --git a/plugins/scaffolder/src/lib/filesystem/WebFileSystemAccess.ts b/plugins/scaffolder/src/lib/filesystem/WebFileSystemAccess.ts index c304e7b394..ddee37117b 100644 --- a/plugins/scaffolder/src/lib/filesystem/WebFileSystemAccess.ts +++ b/plugins/scaffolder/src/lib/filesystem/WebFileSystemAccess.ts @@ -36,10 +36,13 @@ const showDirectoryPicker = (window as any).showDirectoryPicker as | undefined; class WebFileAccess implements TemplateFileAccess { - constructor( - readonly path: string, - private readonly handle: WritableFileHandle, - ) {} + readonly path: string; + private readonly handle: WritableFileHandle; + + constructor(path: string, handle: WritableFileHandle) { + this.path = path; + this.handle = handle; + } file(): Promise { return this.handle.getFile(); @@ -54,7 +57,11 @@ class WebFileAccess implements TemplateFileAccess { /** @internal */ export class WebDirectoryAccess implements TemplateDirectoryAccess { - constructor(private readonly handle: IterableDirectoryHandle) {} + private readonly handle: IterableDirectoryHandle; + + constructor(handle: IterableDirectoryHandle) { + this.handle = handle; + } async listFiles(): Promise { const content = []; diff --git a/plugins/search-backend-module-elasticsearch/report.api.md b/plugins/search-backend-module-elasticsearch/report.api.md index 94cce4b319..c2fb23efd6 100644 --- a/plugins/search-backend-module-elasticsearch/report.api.md +++ b/plugins/search-backend-module-elasticsearch/report.api.md @@ -348,7 +348,7 @@ export class ElasticSearchSearchEngine implements SearchEngine { indexPrefix: string, logger: LoggerService, batchSize: number, - batchKeyField?: string | undefined, + batchKeyField?: string, highlightOptions?: ElasticSearchHighlightOptions, queryOptions?: ElasticSearchQueryConfig, ); diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts index 2e95385eb4..c03541d9d0 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts @@ -136,16 +136,29 @@ export class ElasticSearchSearchEngine implements SearchEngine { private readonly highlightOptions: ElasticSearchHighlightConfig; private readonly queryOptions?: ElasticSearchQueryConfig; + private readonly elasticSearchClientOptions: ElasticSearchClientOptions; + private readonly aliasPostfix: string; + private readonly indexPrefix: string; + private readonly logger: LoggerService; + private readonly batchSize: number; + private readonly batchKeyField?: string; + constructor( - private readonly elasticSearchClientOptions: ElasticSearchClientOptions, - private readonly aliasPostfix: string, - private readonly indexPrefix: string, - private readonly logger: LoggerService, - private readonly batchSize: number, - private readonly batchKeyField?: string, + elasticSearchClientOptions: ElasticSearchClientOptions, + aliasPostfix: string, + indexPrefix: string, + logger: LoggerService, + batchSize: number, + batchKeyField?: string, highlightOptions?: ElasticSearchHighlightOptions, queryOptions?: ElasticSearchQueryConfig, ) { + this.elasticSearchClientOptions = elasticSearchClientOptions; + this.aliasPostfix = aliasPostfix; + this.indexPrefix = indexPrefix; + this.logger = logger; + this.batchSize = batchSize; + this.batchKeyField = batchKeyField; this.elasticSearchClientWrapper = ElasticSearchClientWrapper.fromClientOptions(elasticSearchClientOptions); const uuidTag = uuid(); diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts index 57c22fd19f..1a024be33c 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts @@ -88,15 +88,17 @@ export class PgSearchEngine implements SearchEngine { private readonly highlightOptions: PgSearchHighlightOptions; private readonly indexerBatchSize: number; private readonly normalization: number; + private readonly databaseStore: DatabaseStore; /** * @deprecated This will be marked as private in a future release, please us fromConfig instead */ constructor( - private readonly databaseStore: DatabaseStore, + databaseStore: DatabaseStore, config: Config, logger?: LoggerService, ) { + this.databaseStore = databaseStore; const uuidTag = uuid(); const highlightConfig = config.getOptionalConfig( 'search.pg.highlightOptions', diff --git a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts index 0c0e838f0d..21512361a9 100644 --- a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts +++ b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts @@ -75,7 +75,11 @@ export class DatabaseDocumentStore implements DatabaseStore { } } - constructor(private readonly db: Knex) {} + private readonly db: Knex; + + constructor(db: Knex) { + this.db = db; + } async transaction(fn: (tx: Knex.Transaction) => Promise): Promise { return await this.db.transaction(fn); diff --git a/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.ts b/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.ts index bf78b98040..2771f7bf29 100644 --- a/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.ts +++ b/plugins/search-backend-node/src/collators/NewlineDelimitedJsonCollatorFactory.ts @@ -69,13 +69,20 @@ export class NewlineDelimitedJsonCollatorFactory public readonly visibilityPermission: Permission | undefined; + private readonly searchPattern: string; + private readonly reader: UrlReaderService; + private readonly logger: LoggerService; + private constructor( type: string, - private readonly searchPattern: string, - private readonly reader: UrlReaderService, - private readonly logger: LoggerService, + searchPattern: string, + reader: UrlReaderService, + logger: LoggerService, visibilityPermission: Permission | undefined, ) { + this.searchPattern = searchPattern; + this.reader = reader; + this.logger = logger; this.type = type; this.visibilityPermission = visibilityPermission; } diff --git a/plugins/search-backend/src/service/AuthorizedSearchEngine.ts b/plugins/search-backend/src/service/AuthorizedSearchEngine.ts index d9d3feeacf..b14e8d33d5 100644 --- a/plugins/search-backend/src/service/AuthorizedSearchEngine.ts +++ b/plugins/search-backend/src/service/AuthorizedSearchEngine.ts @@ -66,14 +66,22 @@ export function encodePageCursor({ page }: { page: number }): string { export class AuthorizedSearchEngine implements SearchEngine { private readonly queryLatencyBudgetMs: number; + private readonly searchEngine: SearchEngine; + private readonly types: Record; + private readonly permissions: PermissionsService; + private readonly auth: AuthService; constructor( - private readonly searchEngine: SearchEngine, - private readonly types: Record, - private readonly permissions: PermissionsService, - private readonly auth: AuthService, + searchEngine: SearchEngine, + types: Record, + permissions: PermissionsService, + auth: AuthService, config: Config, ) { + this.searchEngine = searchEngine; + this.types = types; + this.permissions = permissions; + this.auth = auth; this.queryLatencyBudgetMs = config.getOptionalNumber('search.permissions.queryLatencyBudgetMs') ?? 1000; diff --git a/plugins/search-react/report.api.md b/plugins/search-react/report.api.md index 6c9a1cd09d..96b45776bc 100644 --- a/plugins/search-react/report.api.md +++ b/plugins/search-react/report.api.md @@ -89,9 +89,9 @@ export type HighlightedSearchResultTextProps = { // @public export class MockSearchApi implements SearchApi { - constructor(mockedResults?: SearchResultSet | undefined); + constructor(mockedResults?: SearchResultSet); // (undocumented) - mockedResults?: SearchResultSet | undefined; + mockedResults?: SearchResultSet; // (undocumented) query( _query: SearchQuery, diff --git a/plugins/search-react/src/api.ts b/plugins/search-react/src/api.ts index 61da8a3d77..1763aec424 100644 --- a/plugins/search-react/src/api.ts +++ b/plugins/search-react/src/api.ts @@ -40,7 +40,11 @@ export interface SearchApi { * Search Api Mock that can be used in tests and storybooks */ export class MockSearchApi implements SearchApi { - constructor(public mockedResults?: SearchResultSet) {} + public mockedResults?: SearchResultSet; + + constructor(mockedResults?: SearchResultSet) { + this.mockedResults = mockedResults; + } query( _query: SearchQuery, diff --git a/plugins/signals/src/api/SignalClient.ts b/plugins/signals/src/api/SignalClient.ts index 7ffb88f66f..15948236c5 100644 --- a/plugins/signals/src/api/SignalClient.ts +++ b/plugins/signals/src/api/SignalClient.ts @@ -55,12 +55,22 @@ export class SignalClient implements SignalApi { ); } + private identity: IdentityApi; + private discoveryApi: DiscoveryApi; + private connectTimeout: number; + private reconnectTimeout: number; + private constructor( - private identity: IdentityApi, - private discoveryApi: DiscoveryApi, - private connectTimeout: number, - private reconnectTimeout: number, - ) {} + identity: IdentityApi, + discoveryApi: DiscoveryApi, + connectTimeout: number, + reconnectTimeout: number, + ) { + this.identity = identity; + this.discoveryApi = discoveryApi; + this.connectTimeout = connectTimeout; + this.reconnectTimeout = reconnectTimeout; + } subscribe( channel: string, diff --git a/plugins/techdocs-node/src/stages/generate/helpers.ts b/plugins/techdocs-node/src/stages/generate/helpers.ts index 0cba56cfa5..0930ec89c1 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.ts @@ -129,7 +129,13 @@ export const getRepoUrlFromLocationAnnotation = ( }; class UnknownTag { - constructor(public readonly data: any, public readonly type?: string) {} + public readonly data: any; + public readonly type?: string; + + constructor(data: any, type?: string) { + this.data = data; + this.type = type; + } } export const MKDOCS_SCHEMA = DEFAULT_SCHEMA.extend([ diff --git a/plugins/techdocs-node/src/stages/publish/azureBlobStorage.test.ts b/plugins/techdocs-node/src/stages/publish/azureBlobStorage.test.ts index 3b5e8d5632..87ac87ff06 100644 --- a/plugins/techdocs-node/src/stages/publish/azureBlobStorage.test.ts +++ b/plugins/techdocs-node/src/stages/publish/azureBlobStorage.test.ts @@ -39,7 +39,11 @@ jest.mock('@azure/identity', () => ({ jest.mock('@azure/storage-blob', () => { class BlockBlobClient { - constructor(private readonly blobName: string) {} + private readonly blobName: string; + + constructor(blobName: string) { + this.blobName = blobName; + } uploadFile(source: string): Promise { mockDir.addContent({ @@ -117,7 +121,11 @@ jest.mock('@azure/storage-blob', () => { } class ContainerClient { - constructor(private readonly containerName: string) {} + private readonly containerName: string; + + constructor(containerName: string) { + this.containerName = containerName; + } getProperties(): Promise { return Promise.resolve({ @@ -173,10 +181,13 @@ jest.mock('@azure/storage-blob', () => { } class BlobServiceClient { - constructor( - public readonly url: string, - private readonly credential?: StorageSharedKeyCredential, - ) {} + public readonly url: string; + private readonly credential?: StorageSharedKeyCredential; + + constructor(url: string, credential?: StorageSharedKeyCredential) { + this.url = url; + this.credential = credential; + } getContainerClient(containerName: string) { if (containerName === 'bad_container') { diff --git a/plugins/techdocs-node/src/stages/publish/googleStorage.test.ts b/plugins/techdocs-node/src/stages/publish/googleStorage.test.ts index 322149660e..7b6888fabf 100644 --- a/plugins/techdocs-node/src/stages/publish/googleStorage.test.ts +++ b/plugins/techdocs-node/src/stages/publish/googleStorage.test.ts @@ -34,7 +34,11 @@ let createdStorageOptions: Array = []; jest.mock('@google-cloud/storage', () => { class GCSFile { - constructor(private readonly filePath: string) {} + private readonly filePath: string; + + constructor(filePath: string) { + this.filePath = filePath; + } exists() { return new Promise(async (resolve, reject) => { @@ -77,7 +81,11 @@ jest.mock('@google-cloud/storage', () => { } class Bucket { - constructor(private readonly bucketName: string) {} + private readonly bucketName: string; + + constructor(bucketName: string) { + this.bucketName = bucketName; + } async getMetadata() { if (this.bucketName === 'bad_bucket_name') { @@ -121,7 +129,10 @@ jest.mock('@google-cloud/storage', () => { } class Storage { - constructor(readonly options?: StorageOptions) { + readonly options?: StorageOptions; + + constructor(options?: StorageOptions) { + this.options = options; createdStorageOptions.push(options); } diff --git a/plugins/user-settings-backend/src/database/DatabaseUserSettingsStore.ts b/plugins/user-settings-backend/src/database/DatabaseUserSettingsStore.ts index 5a051e8806..8caa62c4cd 100644 --- a/plugins/user-settings-backend/src/database/DatabaseUserSettingsStore.ts +++ b/plugins/user-settings-backend/src/database/DatabaseUserSettingsStore.ts @@ -59,7 +59,11 @@ export class DatabaseUserSettingsStore implements UserSettingsStore { return new DatabaseUserSettingsStore(client); } - private constructor(private readonly db: Knex) {} + private readonly db: Knex; + + private constructor(db: Knex) { + this.db = db; + } async get(options: { userEntityRef: string; diff --git a/plugins/user-settings/src/apis/StorageApi/UserSettingsStorage.ts b/plugins/user-settings/src/apis/StorageApi/UserSettingsStorage.ts index 6b109f5ecd..aa3080345c 100644 --- a/plugins/user-settings/src/apis/StorageApi/UserSettingsStorage.ts +++ b/plugins/user-settings/src/apis/StorageApi/UserSettingsStorage.ts @@ -52,15 +52,31 @@ export class UserSettingsStorage implements StorageApi { Observable> >(); + private readonly namespace: string; + private readonly fetchApi: FetchApi; + private readonly discoveryApi: DiscoveryApi; + private readonly errorApi: ErrorApi; + private readonly identityApi: IdentityApi; + private readonly fallback: WebStorage; + private readonly signalApi?: SignalApi; + private constructor( - private readonly namespace: string, - private readonly fetchApi: FetchApi, - private readonly discoveryApi: DiscoveryApi, - private readonly errorApi: ErrorApi, - private readonly identityApi: IdentityApi, - private readonly fallback: WebStorage, - private readonly signalApi?: SignalApi, - ) {} + namespace: string, + fetchApi: FetchApi, + discoveryApi: DiscoveryApi, + errorApi: ErrorApi, + identityApi: IdentityApi, + fallback: WebStorage, + signalApi?: SignalApi, + ) { + this.namespace = namespace; + this.fetchApi = fetchApi; + this.discoveryApi = discoveryApi; + this.errorApi = errorApi; + this.identityApi = identityApi; + this.fallback = fallback; + this.signalApi = signalApi; + } static create(options: { fetchApi: FetchApi;