diff --git a/src/application/project/configuration/manager/jsonConfigurationFileManager.ts b/src/application/project/configuration/manager/jsonConfigurationFileManager.ts index ca75114..688ba6d 100644 --- a/src/application/project/configuration/manager/jsonConfigurationFileManager.ts +++ b/src/application/project/configuration/manager/jsonConfigurationFileManager.ts @@ -33,6 +33,7 @@ export type Configuration = { projectDirectory: WorkingDirectory, fullValidator: Validator, partialValidator: Validator, + configurationFile: string, }; export class JsonConfigurationFileManager implements ConfigurationManager { @@ -40,22 +41,22 @@ export class JsonConfigurationFileManager implements ConfigurationManager { private readonly fileSystem: FileSystem; - private readonly projectDirectory: WorkingDirectory; - private readonly fullValidator: Validator; private readonly partialValidator: Validator; - public constructor({fileSystem, projectDirectory, fullValidator, partialValidator}: Configuration) { - this.fileSystem = fileSystem; - this.projectDirectory = projectDirectory; - this.fullValidator = fullValidator; - this.partialValidator = partialValidator; + private readonly configurationFile: string; + + public constructor(configuration: Configuration) { + this.fileSystem = configuration.fileSystem; + this.fullValidator = configuration.fullValidator; + this.partialValidator = configuration.partialValidator; + this.configurationFile = configuration.configurationFile; } public async isInitialized(state: InitializationState = InitializationState.ANY): Promise { if (state === InitializationState.ANY) { - return this.fileSystem.exists(this.getConfigurationFilePath()); + return this.fileSystem.exists(this.configurationFile); } const validator = state === InitializationState.FULL @@ -160,7 +161,7 @@ export class JsonConfigurationFileManager implements ConfigurationManager { validator: Validator, ): Promise>> { const file: LoadedFile = { - path: this.getConfigurationFilePath(), + path: this.configurationFile, source: null, configuration: null, }; @@ -185,10 +186,6 @@ export class JsonConfigurationFileManager implements ConfigurationManager { return file; } - private getConfigurationFilePath(): string { - return this.fileSystem.joinPaths(this.projectDirectory.get(), 'croct.json'); - } - private async validateConfiguration( validator: Validator, value: JsonValue, diff --git a/src/infrastructure/application/cli/cli.ts b/src/infrastructure/application/cli/cli.ts index 52baf98..d875274 100644 --- a/src/infrastructure/application/cli/cli.ts +++ b/src/infrastructure/application/cli/cli.ts @@ -349,6 +349,7 @@ export type Configuration = { cliTokenIssuer: string, apiKeyTokenDuration: number, adminTokenDuration: number, + configurationFile: string, directories: { current?: string, config: string, @@ -451,6 +452,7 @@ export class Cli { adminTokenParameter: configuration.adminTokenParameter ?? 'accessToken', adminGraphqlEndpoint: configuration?.adminGraphqlEndpoint ?? new URL('https://app.croct.com/graphql'), + configurationFile: configuration.configurationFile ?? 'croct.json', directories: { current: configuration.directories?.current ?? process.getCurrentDirectory(), config: configuration.directories?.config ?? appPaths.config(), @@ -2310,11 +2312,19 @@ export class Cli { private getConfigurationManager(): ConfigurationManager { return this.share(this.getConfigurationManager, () => { + const fileSystem = this.getFileSystem(); + const manager = new JsonConfigurationFileManager({ - fileSystem: this.getFileSystem(), + fileSystem: fileSystem, fullValidator: new FullCroctConfigurationValidator(), partialValidator: new PartialCroctConfigurationValidator(), projectDirectory: this.workingDirectory, + configurationFile: fileSystem.isAbsolutePath(this.configuration.configurationFile) + ? this.configuration.configurationFile + : fileSystem.joinPaths( + this.workingDirectory.get(), + this.configuration.configurationFile, + ), }); return new IndexedConfigurationManager({ diff --git a/src/infrastructure/application/cli/program.ts b/src/infrastructure/application/cli/program.ts index c17fc1e..ae4b227 100644 --- a/src/infrastructure/application/cli/program.ts +++ b/src/infrastructure/application/cli/program.ts @@ -65,6 +65,7 @@ function createProgram(config: Configuration): typeof program { return url; }) .option('--no-interaction', 'Run the CLI in non-interactive mode.') + .option('--config ', 'Path to the configuration file.') .addOption( new Option('--stateless', 'Run the CLI without saving any state locally.') .env('CROCT_STATELESS') @@ -455,6 +456,7 @@ export async function run(args: string[] = process.argv, welcome = true): Promis templateRegistryUrl: options.registry === undefined ? undefined : new URL(options.registry), + configurationFile: options.config, }); const template = getTemplate(invocation.args);