diff --git a/plugins/filter-jsonpath/package.json b/plugins/filter-jsonpath/package.json index 6f8dd35e..a2dbef37 100644 --- a/plugins/filter-jsonpath/package.json +++ b/plugins/filter-jsonpath/package.json @@ -2,7 +2,7 @@ "name": "filter-jsonpath", "version": "0.0.1", "scripts": { - "build": "yaakcli src/index.ts" + "build": "BUILD_PLATFORM=browser yaakcli src/index.ts" }, "dependencies": { "jsonpath": "^1.1.1" diff --git a/plugins/importer-openapi/package.json b/plugins/importer-openapi/package.json index a60cd1e7..2164487e 100644 --- a/plugins/importer-openapi/package.json +++ b/plugins/importer-openapi/package.json @@ -1,5 +1,5 @@ { - "name": "importer-postman", + "name": "importer-openapi", "version": "0.0.1", "scripts": { "build": "yaakcli ./src/index.js" diff --git a/plugins/importer-openapi/src/index.ts b/plugins/importer-openapi/src/index.ts index 3171a628..9a73f92d 100644 --- a/plugins/importer-openapi/src/index.ts +++ b/plugins/importer-openapi/src/index.ts @@ -1,5 +1,5 @@ import { convert } from 'openapi-to-postmanv2'; -import { pluginHookImport as pluginHookImportPostman } from '../../importer-postman/build'; +import { pluginHookImport as pluginHookImportPostman } from '../../importer-postman'; import { Folder, HttpRequest, Workspace, Environment } from '../../../types/models'; type AtLeast = Partial & Pick; @@ -15,15 +15,21 @@ export async function pluginHookImport( ctx: any, contents: string, ): Promise<{ resources: ExportResources } | undefined> { - const result = await new Promise((resolve, reject) => { - convert({ type: 'string', data: contents }, {}, (err, result) => { - if (err != null) reject(err); + let postmanCollection; + try { + postmanCollection = await new Promise((resolve, reject) => { + convert({ type: 'string', data: contents }, {}, (err, result) => { + if (err != null) reject(err); - if (Array.isArray(result.output) && result.output.length > 0) { - resolve(JSON.stringify(result.output[0].data)); - } + if (Array.isArray(result.output) && result.output.length > 0) { + resolve(result.output[0].data); + } + }); }); - }); + } catch (err) { + // Probably not an OpenAPI file, so skip it + return undefined; + } - return pluginHookImportPostman(ctx, result); + return pluginHookImportPostman(ctx, JSON.stringify(postmanCollection)); } diff --git a/plugins/importer-openapi/tests/index.test.ts b/plugins/importer-openapi/tests/index.test.ts index c8e30a63..f89dcf7d 100644 --- a/plugins/importer-openapi/tests/index.test.ts +++ b/plugins/importer-openapi/tests/index.test.ts @@ -7,6 +7,11 @@ describe('importer-openapi', () => { const p = path.join(__dirname, 'fixtures'); const fixtures = fs.readdirSync(p); + test('Skips invalid file', async () => { + const imported = await pluginHookImport({}, '{}'); + expect(imported).toBeUndefined(); + }) + for (const fixture of fixtures) { test('Imports ' + fixture, async () => { const contents = fs.readFileSync(path.join(p, fixture), 'utf-8'); @@ -14,6 +19,7 @@ describe('importer-openapi', () => { expect(imported?.resources.workspaces).toEqual([ expect.objectContaining({ name: 'Swagger Petstore - OpenAPI 3.0', + description: expect.stringContaining('This is a sample Pet Store Server'), }), ]); expect(imported?.resources.httpRequests.length).toBe(19); diff --git a/plugins/importer-postman/src/index.ts b/plugins/importer-postman/src/index.ts index d4aa2755..57263d2a 100644 --- a/plugins/importer-postman/src/index.ts +++ b/plugins/importer-postman/src/index.ts @@ -39,7 +39,7 @@ export function pluginHookImport( model: 'workspace', id: generateId('workspace'), name: info.name || 'Postman Import', - description: info.description || '', + description: info.description?.content ?? info.description ?? '', variables: root.variable?.map((v: any) => ({ name: v.key, @@ -73,7 +73,7 @@ export function pluginHookImport( folderId, name: v.name, method: r.method || 'GET', - url: typeof r.url === 'string' ? r.url : toRecord(r.url).raw, + url: typeof r.url === 'string' ? r.url : convertUrl(toRecord(r.url)), body: bodyPatch.body, bodyType: bodyPatch.bodyType, authentication: authPatch.authentication, @@ -103,6 +103,43 @@ export function pluginHookImport( return { resources: convertTemplateSyntax(exportResources) }; } +function convertUrl(url: Record) { + if ('raw' in url) { + return url.raw; + } + + let v = ''; + + if ('protocol' in url && typeof url.protocol === 'string') { + v += `${url.protocol}://`; + } + + if ('host' in url) { + v += `${Array.isArray(url.host) ? url.host.join('.') : url.host}`; + } + + if ('port' in url && typeof url.port === 'string') { + v += `:${url.port}`; + } + + if ('path' in url && Array.isArray(url.path) && url.path.length > 0) { + v += `/${Array.isArray(url.path) ? url.path.join('/') : url.path}`; + } + + if ('query' in url && Array.isArray(url.query) && url.query.length > 0) { + const qs = url.query.map(q => `${q.key ?? ''}=${q.value ?? ''}`).join('&'); + v += `?${qs}`; + } + + if ('hash' in url && typeof url.hash === 'string') { + v += `#${url.hash}`; + } + + // TODO: Implement url.variables (path variables) + + return v; +} + function importAuth( rawAuth: any, ): Pick { @@ -181,16 +218,16 @@ function importBody(rawBody: any): Pick f.src != null ? { - enabled: !f.disabled, - contentType: f.contentType ?? null, - name: f.key ?? '', - file: f.src ?? '', - } + enabled: !f.disabled, + contentType: f.contentType ?? null, + name: f.key ?? '', + file: f.src ?? '', + } : { - enabled: !f.disabled, - name: f.key ?? '', - value: f.value ?? '', - }, + enabled: !f.disabled, + name: f.key ?? '', + value: f.value ?? '', + }, ), }, }; @@ -216,7 +253,8 @@ function importBody(rawBody: any): Pick | null { try { return toRecord(JSON.parse(jsonStr)); - } catch (err) {} + } catch (err) { + } return null; }