From bb02422a83a6451b13f529892b1fb81c9c84b969 Mon Sep 17 00:00:00 2001 From: Nick Phair Date: Thu, 15 Feb 2024 21:48:27 -0500 Subject: [PATCH] feat(#644): add cli option for openapitools.json --- apps/generator-cli/src/app/app.module.ts | 2 +- .../src/app/services/config.service.spec.ts | 101 +++++++++++++++++- .../src/app/services/config.service.ts | 17 ++- 3 files changed, 115 insertions(+), 5 deletions(-) diff --git a/apps/generator-cli/src/app/app.module.ts b/apps/generator-cli/src/app/app.module.ts index 2f43f1985..3abf47676 100644 --- a/apps/generator-cli/src/app/app.module.ts +++ b/apps/generator-cli/src/app/app.module.ts @@ -19,7 +19,7 @@ import {ConfigService, GeneratorService, PassThroughService, UIService, VersionM VersionManagerService, { provide: COMMANDER_PROGRAM, - useValue: new Command('openapi-generator-cli').helpOption(false).usage(' []') + useValue: new Command('openapi-generator-cli').helpOption(false).usage(' []').option( '--openapitools ', 'Use the specified openapi-generator-cli configuration file') }, {provide: LOGGER, useValue: console} ] diff --git a/apps/generator-cli/src/app/services/config.service.spec.ts b/apps/generator-cli/src/app/services/config.service.spec.ts index 9e963f590..647f48eab 100644 --- a/apps/generator-cli/src/app/services/config.service.spec.ts +++ b/apps/generator-cli/src/app/services/config.service.spec.ts @@ -1,6 +1,7 @@ import { Test } from '@nestjs/testing'; +import { Command, createCommand } from 'commander'; import { ConfigService } from './config.service'; -import { LOGGER } from '../constants'; +import { LOGGER, COMMANDER_PROGRAM } from '../constants'; jest.mock('fs-extra'); // eslint-disable-next-line @typescript-eslint/no-var-requires @@ -8,12 +9,20 @@ const fs = jest.mocked(require('fs-extra')); describe('ConfigService', () => { let fixture: ConfigService; + let program: Command; const log = jest.fn(); beforeEach(async () => { + program = createCommand(); + jest.spyOn(program, 'helpInformation'); + const moduleRef = await Test.createTestingModule({ - providers: [ConfigService, { provide: LOGGER, useValue: { log } }], + providers: [ + ConfigService, + { provide: LOGGER, useValue: { log } }, + { provide: COMMANDER_PROGRAM, useValue: program }, + ], }).compile(); fixture = moduleRef.get(ConfigService); @@ -141,5 +150,93 @@ describe('ConfigService', () => { ); }); }); + + describe('configFileOrDefault()', () => { + describe('--openapitools set', () => { + beforeEach(async () => { + program = createCommand(); + program.opts().openapitools = '/tmp/myopenapitools.json'; + + const moduleRef = await Test.createTestingModule({ + providers: [ + ConfigService, + { provide: LOGGER, useValue: { log } }, + { provide: COMMANDER_PROGRAM, useValue: program }, + ], + }).compile(); + + fixture = moduleRef.get(ConfigService); + fs.writeJSONSync.mockReset(); + fs.readJSONSync.mockReset(); + fs.ensureFileSync.mockReset(); + }); + it('returns path set at cli, if openapitools argument provided', () => { + expect(fixture.configFile).toEqual('/tmp/myopenapitools.json'); + }); + }); + describe('--openapitools not set', () => { + it('returns default path, if openapitools argument not provided', () => { + expect( + fixture.configFile.endsWith( + 'openapi-generator-cli/openapitools.json' + ) + ).toBeTruthy(); + }); + }); + }); }); }); + +//describe('ConfigService From CLI Config', () => { +// let fixture: ConfigService; +// let program: Command; +// +// const log = jest.fn(); +// +// beforeEach(async () => { +// program = createCommand(); +// program.opts().openapitools = '/tmp/openapitools.json'; +// +// const moduleRef = await Test.createTestingModule({ +// providers: [ +// ConfigService, +// { provide: LOGGER, useValue: { log } }, +// { provide: COMMANDER_PROGRAM, useValue: program }, +// ], +// }).compile(); +// +// fixture = moduleRef.get(ConfigService); +// fs.writeJSONSync.mockReset(); +// fs.readJSONSync.mockReset(); +// fs.ensureFileSync.mockReset(); +// }); +// +// describe('API', () => { +// describe('configFileOrDefault()', () => { +// describe('--openapitools set', () => { +// beforeEach(async () => { +// program.opts().openapitools = '/tmp/openapitools.json'; +// +// const moduleRef = await Test.createTestingModule({ +// providers: [ +// ConfigService, +// { provide: LOGGER, useValue: { log } }, +// { provide: COMMANDER_PROGRAM, useValue: program }, +// ], +// }).compile(); +// +// fixture = moduleRef.get(ConfigService); +// }); +// it('returns path set at cli, if openapitools argument provided', () => { +// expect(fixture.configFile).toEqual('/tmp/openapitools.json'); +// }); +// }); +// describe('--openapitools not set', () => { +// it('returns default path, if openapitools argument not provided', () => { +// expect(fixture.configFile).toEqual('/tmp/openapitools.json'); +// }); +// }); +// }); +// }); +//}); +// diff --git a/apps/generator-cli/src/app/services/config.service.ts b/apps/generator-cli/src/app/services/config.service.ts index a6f0a9f0e..f968eadd0 100644 --- a/apps/generator-cli/src/app/services/config.service.ts +++ b/apps/generator-cli/src/app/services/config.service.ts @@ -1,14 +1,26 @@ import {Inject, Injectable} from '@nestjs/common'; import * as path from 'path'; -import {LOGGER} from '../constants'; +import {COMMANDER_PROGRAM, LOGGER} from '../constants'; import {set, get, has, merge} from 'lodash'; import * as fs from 'fs-extra'; +import { Command } from 'commander'; @Injectable() export class ConfigService { public readonly cwd = process.env.PWD || process.env.INIT_CWD || process.cwd() - public readonly configFile = path.resolve(this.cwd, 'openapitools.json') + public readonly configFile = this.configFileOrDefault(); + + private configFileOrDefault() { + this.program.parseOptions(process.argv); + const conf = this.program.opts().openapitools; + + if(!conf) { + return path.resolve(this.cwd, 'openapitools.json'); + } + + return path.isAbsolute(conf) ? conf : path.resolve(this.cwd, conf); + } public get useDocker() { return this.get('generator-cli.useDocker', false); @@ -28,6 +40,7 @@ export class ConfigService { constructor( @Inject(LOGGER) private readonly logger: LOGGER, + @Inject(COMMANDER_PROGRAM) private readonly program: Command, ) { }