From e359da5afdfaf2a992117976b150f8edf2c62610 Mon Sep 17 00:00:00 2001 From: Opender Singh Date: Fri, 26 Jun 2020 12:32:15 +1200 Subject: [PATCH] CLI: input and output flags should respect workingDir (#2307) --- .../src/commands/__tests__/generate.test.js | 27 +++++++++++++++++-- .../insomnia-cli/src/commands/generate.js | 13 ++++++--- packages/insomnia-cli/src/db/mem-db.js | 16 +++++------ packages/insomnia-cli/src/db/types.js | 8 +----- 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/packages/insomnia-cli/src/commands/__tests__/generate.test.js b/packages/insomnia-cli/src/commands/__tests__/generate.test.js index d22c220928..34fe886414 100644 --- a/packages/insomnia-cli/src/commands/__tests__/generate.test.js +++ b/packages/insomnia-cli/src/commands/__tests__/generate.test.js @@ -55,7 +55,7 @@ describe('generateConfig()', () => { expect(consoleSpy).toHaveBeenCalledWith('a\n---\nb\n'); }); - it('should write converted documents to file system', async () => { + it('should write generated documents to file system', async () => { const consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); const writeFileSpy = jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {}); mock(o2k.generate).mockResolvedValue({ documents: ['a', 'b'] }); @@ -63,7 +63,30 @@ describe('generateConfig()', () => { await generateConfig(filePath, { ...base, output: 'output.yaml' }); expect(o2k.generate).toHaveBeenCalledWith(filePath, ConversionTypeMap[base.type]); - expect(writeFileSpy).toHaveBeenCalledWith(path.resolve('output.yaml'), 'a\n---\nb\n'); + expect(writeFileSpy).toHaveBeenCalledWith('output.yaml', 'a\n---\nb\n'); + expect(consoleSpy).not.toHaveBeenCalled(); + }); + + it('should generate documents using workingDir', async () => { + const consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); + const writeFileSpy = jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {}); + mock(o2k.generate).mockResolvedValue({ documents: ['a', 'b'] }); + + await generateConfig('file.yaml', { + ...base, + workingDir: 'test/dir', + output: 'output.yaml', + }); + + // Read from workingDir + expect(o2k.generate).toHaveBeenCalledWith( + path.normalize('test/dir/file.yaml'), + ConversionTypeMap[base.type], + ); + expect(writeFileSpy).toHaveBeenCalledWith( + path.normalize('test/dir/output.yaml'), + 'a\n---\nb\n', + ); expect(consoleSpy).not.toHaveBeenCalled(); }); }); diff --git a/packages/insomnia-cli/src/commands/generate.js b/packages/insomnia-cli/src/commands/generate.js index da663cfbb0..6270bde582 100644 --- a/packages/insomnia-cli/src/commands/generate.js +++ b/packages/insomnia-cli/src/commands/generate.js @@ -34,21 +34,26 @@ export async function generateConfig( return; } - const { type, output, workingDir } = options; + const { type, output } = options; + + const workingDir = options.workingDir || '.'; const db = await gitDataDirDb({ dir: workingDir, filterTypes: ['ApiSpec'] }); let result: ConversionResult; + // try get from db const specFromDb = db.ApiSpec.get(identifier); try { if (specFromDb?.contents) { result = await o2k.generateFromString(specFromDb.contents, ConversionTypeMap[type]); } else { - result = await o2k.generate(identifier, ConversionTypeMap[type]); + // try load as a file + const fileName = path.join(workingDir, identifier); + result = await o2k.generate(fileName, ConversionTypeMap[type]); } } catch (err) { - console.log('Config failed to generate', err); + console.log('Config failed to generate:', err.message); return; } @@ -58,7 +63,7 @@ export async function generateConfig( const document = yamlDocs.join('\n---\n').replace(/\n+---\n+/g, '\n---\n'); if (output) { - const fullOutputPath = path.resolve(output); + const fullOutputPath = path.join(workingDir, output); fs.writeFileSync(fullOutputPath, document); } else { console.log(document); diff --git a/packages/insomnia-cli/src/db/mem-db.js b/packages/insomnia-cli/src/db/mem-db.js index afdb8f7749..a98cb45b7c 100644 --- a/packages/insomnia-cli/src/db/mem-db.js +++ b/packages/insomnia-cli/src/db/mem-db.js @@ -2,14 +2,14 @@ import fs from 'fs'; import path from 'path'; import YAML from 'yaml'; -import type { ApiSpec } from './types'; +import type { ApiSpec, BaseModel } from './types'; -type Database = {| +export type Database = {| ApiSpec: Map, - Environment: Map, - Request: Map, - RequestGroup: Map, - Workspace: Map, + Environment: Map, + Request: Map, + RequestGroup: Map, + Workspace: Map, |}; export const emptyDb = (): Database => ({ @@ -21,13 +21,13 @@ export const emptyDb = (): Database => ({ }); type Options = { - dir?: string, + dir: string, filterTypes?: Array<$Keys>, }; export const gitDataDirDb = async ({ dir, filterTypes }: Options): Promise => { const db = emptyDb(); - const insomniaDir = path.normalize(path.join(dir || '.', '.insomnia')); + const insomniaDir = path.join(dir, '.insomnia'); if (!fs.existsSync(insomniaDir)) { // TODO: control logging with verbose flag diff --git a/packages/insomnia-cli/src/db/types.js b/packages/insomnia-cli/src/db/types.js index 325eb0491f..f22de95b07 100644 --- a/packages/insomnia-cli/src/db/types.js +++ b/packages/insomnia-cli/src/db/types.js @@ -1,15 +1,11 @@ // @flow -// These types should come from a shared location (maybe insomnia-importers?) -// They represent the models that are read from an Insomnia data source -// eg. git data directory, insomnia export format, etc +// Simplified and extracted from insomnia-app/app/models/* export type BaseModel = { _id: string, type: string, parentId: string, - modified: number, - created: number, }; type BaseApiSpec = { @@ -18,6 +14,4 @@ type BaseApiSpec = { contents: string, }; -export const SpecName = 'ApiSpec'; - export type ApiSpec = BaseModel & BaseApiSpec;