Skip to content

Commit 5390090

Browse files
authored
Add configuration file option to CLI (#125)
1 parent 471c0d5 commit 5390090

3 files changed

Lines changed: 23 additions & 14 deletions

File tree

src/application/project/configuration/manager/jsonConfigurationFileManager.ts

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,29 +33,30 @@ export type Configuration = {
3333
projectDirectory: WorkingDirectory,
3434
fullValidator: Validator<JsonProjectConfiguration>,
3535
partialValidator: Validator<JsonPartialProjectConfiguration>,
36+
configurationFile: string,
3637
};
3738

3839
export class JsonConfigurationFileManager implements ConfigurationManager {
3940
private static readonly CONFIGURATION_SCHEMA = 'https://schema.croct.com/json/v1/project.json';
4041

4142
private readonly fileSystem: FileSystem;
4243

43-
private readonly projectDirectory: WorkingDirectory;
44-
4544
private readonly fullValidator: Validator<ProjectConfiguration>;
4645

4746
private readonly partialValidator: Validator<PartialProjectConfiguration>;
4847

49-
public constructor({fileSystem, projectDirectory, fullValidator, partialValidator}: Configuration) {
50-
this.fileSystem = fileSystem;
51-
this.projectDirectory = projectDirectory;
52-
this.fullValidator = fullValidator;
53-
this.partialValidator = partialValidator;
48+
private readonly configurationFile: string;
49+
50+
public constructor(configuration: Configuration) {
51+
this.fileSystem = configuration.fileSystem;
52+
this.fullValidator = configuration.fullValidator;
53+
this.partialValidator = configuration.partialValidator;
54+
this.configurationFile = configuration.configurationFile;
5455
}
5556

5657
public async isInitialized(state: InitializationState = InitializationState.ANY): Promise<boolean> {
5758
if (state === InitializationState.ANY) {
58-
return this.fileSystem.exists(this.getConfigurationFilePath());
59+
return this.fileSystem.exists(this.configurationFile);
5960
}
6061

6162
const validator = state === InitializationState.FULL
@@ -160,7 +161,7 @@ export class JsonConfigurationFileManager implements ConfigurationManager {
160161
validator: Validator<T>,
161162
): Promise<LoadedFile<Omit<T, '$schema'>>> {
162163
const file: LoadedFile<T> = {
163-
path: this.getConfigurationFilePath(),
164+
path: this.configurationFile,
164165
source: null,
165166
configuration: null,
166167
};
@@ -185,10 +186,6 @@ export class JsonConfigurationFileManager implements ConfigurationManager {
185186
return file;
186187
}
187188

188-
private getConfigurationFilePath(): string {
189-
return this.fileSystem.joinPaths(this.projectDirectory.get(), 'croct.json');
190-
}
191-
192189
private async validateConfiguration<T extends JsonPartialProjectConfiguration>(
193190
validator: Validator<T>,
194191
value: JsonValue,

src/infrastructure/application/cli/cli.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ export type Configuration = {
349349
cliTokenIssuer: string,
350350
apiKeyTokenDuration: number,
351351
adminTokenDuration: number,
352+
configurationFile: string,
352353
directories: {
353354
current?: string,
354355
config: string,
@@ -451,6 +452,7 @@ export class Cli {
451452
adminTokenParameter: configuration.adminTokenParameter ?? 'accessToken',
452453
adminGraphqlEndpoint: configuration?.adminGraphqlEndpoint
453454
?? new URL('https://app.croct.com/graphql'),
455+
configurationFile: configuration.configurationFile ?? 'croct.json',
454456
directories: {
455457
current: configuration.directories?.current ?? process.getCurrentDirectory(),
456458
config: configuration.directories?.config ?? appPaths.config(),
@@ -2310,11 +2312,19 @@ export class Cli {
23102312

23112313
private getConfigurationManager(): ConfigurationManager {
23122314
return this.share(this.getConfigurationManager, () => {
2315+
const fileSystem = this.getFileSystem();
2316+
23132317
const manager = new JsonConfigurationFileManager({
2314-
fileSystem: this.getFileSystem(),
2318+
fileSystem: fileSystem,
23152319
fullValidator: new FullCroctConfigurationValidator(),
23162320
partialValidator: new PartialCroctConfigurationValidator(),
23172321
projectDirectory: this.workingDirectory,
2322+
configurationFile: fileSystem.isAbsolutePath(this.configuration.configurationFile)
2323+
? this.configuration.configurationFile
2324+
: fileSystem.joinPaths(
2325+
this.workingDirectory.get(),
2326+
this.configuration.configurationFile,
2327+
),
23182328
});
23192329

23202330
return new IndexedConfigurationManager({

src/infrastructure/application/cli/program.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ function createProgram(config: Configuration): typeof program {
6565
return url;
6666
})
6767
.option('--no-interaction', 'Run the CLI in non-interactive mode.')
68+
.option('--config <path>', 'Path to the configuration file.')
6869
.addOption(
6970
new Option('--stateless', 'Run the CLI without saving any state locally.')
7071
.env('CROCT_STATELESS')
@@ -455,6 +456,7 @@ export async function run(args: string[] = process.argv, welcome = true): Promis
455456
templateRegistryUrl: options.registry === undefined
456457
? undefined
457458
: new URL(options.registry),
459+
configurationFile: options.config,
458460
});
459461

460462
const template = getTemplate(invocation.args);

0 commit comments

Comments
 (0)