From 6548f5061589c01f1d7039f32124a186e214b499 Mon Sep 17 00:00:00 2001 From: Jonathan Montane Date: Fri, 4 Aug 2017 10:57:36 +0200 Subject: [PATCH 01/19] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4e0b4f2..9c013d2 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ PRs are welcomed! Our sole requirement is that organizations that want to extend API-Flow to support their format write both a parser and a serializer, and not simply a serializer. ## Documentation -You can find more information about the internal structure of API-Flow in [src](https://github.com/luckymarmot/API-Flow/tree/develop/src). We've also created a set of templates to help speed up the extension process: [loader](https://github.com/luckymarmot/API-Flow/tree/develop/src/loaders/template/v1.0), [parser](https://github.com/luckymarmot/API-Flow/tree/develop/src/parsers/template/v1.0/), and [environment](https://github.com/luckymarmot/API-Flow/tree/develop/src/environments/template) +You can find more information about the internal structure of API-Flow in [src](https://github.com/JonathanMontane/API-Flow/tree/develop/src). We've also created a set of templates to help speed up the extension process: [loader](https://github.com/JonathanMontane/API-Flow/tree/develop/src/loaders/template/v1.0), [parser](https://github.com/JonathanMontane/API-Flow/tree/develop/src/parsers/template/v1.0/), and [environment](https://github.com/JonathanMontane/API-Flow/tree/develop/src/environments/template) ## License @@ -104,4 +104,4 @@ Copyright © 2016 Paw Inc. ## Contributors -See [Contributors](https://github.com/luckymarmot/API-Flow/graphs/contributors). +See [Contributors](https://github.com/JonathanMontane/API-Flow/graphs/contributors). From 117f3de5d7993d8fe94d77617729d210372581fe Mon Sep 17 00:00:00 2001 From: JonathanMontane Date: Wed, 16 Aug 2017 10:41:52 +0200 Subject: [PATCH 02/19] fixed a bug where a single slash between two components was removed from paths --- src/parsers/paw/Parser.js | 28 +++++++++++++++++++----- src/parsers/paw/__tests__/Parser.spec.js | 21 +++++++++++++++--- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/parsers/paw/Parser.js b/src/parsers/paw/Parser.js index 59e75a3..321e05b 100644 --- a/src/parsers/paw/Parser.js +++ b/src/parsers/paw/Parser.js @@ -421,10 +421,25 @@ methods.isPartOfBaseUrl = (defaultUrl, defaultSecureUrl, urlPart) => { return defaultUrl.indexOf(urlPart) >= 0 || defaultSecureUrl.indexOf(urlPart) >= 0 } -// NOTE: we assume that the urlPart is after the protocol -methods.findIntersection = (defaultUrl, urlPart) => { - const match = (defaultUrl + '####' + urlPart).match(/^.*?(.*)####\1(.*)$/) +/** + * finds the intersection between two strings, and returns the intersection, as well as the right- + * most exclusion. This is used to find the overlap between a host url and a part of a url + * associated with that host. + * @param {string} defaultUrl: the default url to test against. + * @param {string} defaultSecureUrl: the default secure url to test against. + * @param {string} urlPart: the part of url to test + * @returns {{ inside: string, outside: string }} + * + * Note: this assumes Paw only supports http and https. + * Note: this may work incorrectly if url is as follow: http://example.com/example.com/ (not tested) + */ +methods.findIntersection = (defaultUrl, defaultSecureUrl, urlPart) => { + let baseUrl = defaultUrl + if (urlPart.match(/^[^:]*s:\/\//)) { + baseUrl = defaultSecureUrl + } + const match = (baseUrl + '####' + urlPart).match(/^.*?(.*)####\1(.*)$/) // always matches return { inside: match[1], outside: match[2] } } @@ -452,7 +467,10 @@ methods.addComponentToBaseOrPath = ( { baseComponents, pathComponents }, { key: urlPart, value: component } ) => { - if (methods.isPartOfBaseUrl(defaultUrl, defaultSecureUrl, urlPart)) { + if ( + pathComponents.length === 0 && + methods.isPartOfBaseUrl(defaultUrl, defaultSecureUrl, urlPart) + ) { // component is member of base url baseComponents.push({ key: urlPart, value: component }) return { baseComponents, pathComponents } @@ -460,7 +478,7 @@ methods.addComponentToBaseOrPath = ( if (pathComponents.length === 0) { // component may be split between base url and path - const { inside, outside } = methods.findIntersection(defaultUrl, urlPart) + const { inside, outside } = methods.findIntersection(defaultUrl, defaultSecureUrl, urlPart) baseComponents.push({ key: inside, value: inside }) pathComponents.push({ key: outside, value: outside }) } diff --git a/src/parsers/paw/__tests__/Parser.spec.js b/src/parsers/paw/__tests__/Parser.spec.js index 0c9479e..a56da6f 100644 --- a/src/parsers/paw/__tests__/Parser.spec.js +++ b/src/parsers/paw/__tests__/Parser.spec.js @@ -595,13 +595,28 @@ describe('parsers/paw/Parser.js', () => { describe('@findIntersection', () => { it('should work', () => { const defaultUrl = 'http://echo.paw.cloud/pets' - const inputs = [ '/pets', '/pets/234', '/234' ] + const defaultSecureUrl = 'https://echo.paw.cloud/pets' + const inputs = [ + '/pets', + '/pets/234', + '/234', + // this one should be outside, because our intersection method tries to place strings so + // that they overlap from the right + 'http://echo.paw.cloud', + 'http://echo.paw.cloud/pets', + 'https://echo.paw.cloud/pets' + ] const expected = [ { inside: '/pets', outside: '' }, { inside: '/pets', outside: '/234' }, - { inside: '', outside: '/234' } + { inside: '', outside: '/234' }, + { inside: '', outside: 'http://echo.paw.cloud' }, + { inside: 'http://echo.paw.cloud/pets', outside: '' }, + { inside: 'https://echo.paw.cloud/pets', outside: '' } ] - const actual = inputs.map(input => __internals__.findIntersection(defaultUrl, input)) + const actual = inputs.map( + input => __internals__.findIntersection(defaultUrl, defaultSecureUrl, input) + ) expect(actual).toEqual(expected) }) }) From f6317415c8448d267d96cbd7b84f6d849cf71725 Mon Sep 17 00:00:00 2001 From: JonathanMontane Date: Sun, 20 Aug 2017 11:21:31 +0200 Subject: [PATCH 03/19] added support for custom headers for api key auths --- .gitignore | 1 + src/serializers/paw/Serializer.js | 21 ++++++++++------ .../paw/__tests__/Serializer.spec.js | 25 +++++++++++++++---- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index c07f7e1..0859556 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,4 @@ lib/ .DS_Store deploy-script.sh coverage/ +.nyc_output/ diff --git a/src/serializers/paw/Serializer.js b/src/serializers/paw/Serializer.js index 23297a1..a5f0ff1 100644 --- a/src/serializers/paw/Serializer.js +++ b/src/serializers/paw/Serializer.js @@ -442,7 +442,7 @@ methods.convertAuthIntoDynamicValue = (auth) => { * @param {Environment} environment: the environment in which this auth value is applicable. * @param {Auth} auth: the auth to add to the domain * @param {string} key: the name of the auth - * @returns {EnvironmentVariable} the newly created environment variable. + * @returns {{ variable: EnvironmentVariable, auth: Auth }} the newly created environment variable. */ methods.addAuthToDomain = (domain, environment, auth, key) => { const variable = domain.createEnvironmentVariable(key) @@ -450,7 +450,7 @@ methods.addAuthToDomain = (domain, environment, auth, key) => { const ds = methods.wrapDV(dv) variable.setValue(ds, environment) - return variable + return { variable, auth } } /** @@ -1041,7 +1041,7 @@ methods.convertAuthFromReference = (store, reference) => { * converts a reference or an auth into a DynamicString Entry. * @param {Store} store: the store used to resolve references * @param {Auth|Reference} authOrReference: the record to convert into a DynamicString - * @returns {DynamicString} the corresponding DynamicString + * @returns {{ variable: DynamicString, auth: Auth }} the corresponding DynamicString */ methods.convertReferenceOrAuthToDsEntry = (store, authOrReference) => { if (authOrReference instanceof Reference) { @@ -1049,18 +1049,25 @@ methods.convertReferenceOrAuthToDsEntry = (store, authOrReference) => { } const dv = methods.convertAuthIntoDynamicValue(authOrReference) - return methods.wrapDV(dv) + return { variable: methods.wrapDV(dv), auth: authOrReference } } // TODO create Variable DS that has enum with all auth possible /** * sets the Auth DynamicString as am Authorization Header. * @param {PawRequest} pawRequest: the paw request to update - * @param {DynamicString} auth: the DynamicString representing an auth + * @param {Objecti} authData: the object containing the auth representation as a DynamicString and + * the original auth Record. + * @param {DynamicString} variable: the DynamicString representing an auth + * @param {Auth} auth: the original auth * @returns {PawRequest} the update paw request */ -methods.addAuthToRequest = (pawRequest, auth) => { - pawRequest.setHeader('Authorization', auth) +methods.addAuthToRequest = (pawRequest, { variable, auth }) => { + let authName = 'Authorization' + if (auth instanceof Auth.ApiKey) { + authName = auth.get('name') + } + pawRequest.setHeader(authName, variable) return pawRequest } diff --git a/src/serializers/paw/__tests__/Serializer.spec.js b/src/serializers/paw/__tests__/Serializer.spec.js index ccd6baf..1eb1c31 100644 --- a/src/serializers/paw/__tests__/Serializer.spec.js +++ b/src/serializers/paw/__tests__/Serializer.spec.js @@ -746,7 +746,7 @@ describe('serializers/paw/Serializer.js', () => { spyOn(__internals__, 'convertAuthIntoDynamicValue').andReturn(123) spyOn(__internals__, 'wrapDV').andReturn('123') - const expected = variable + const expected = { variable, auth } const actual = __internals__.addAuthToDomain(domain, environment, auth, key) expect(domain.createEnvironmentVariable).toHaveBeenCalledWith(key) @@ -2040,7 +2040,7 @@ describe('serializers/paw/Serializer.js', () => { const store = new Store() const auth = new Auth.Basic() - const expected = '123' + const expected = { variable: '123', auth } const actual = __internals__.convertReferenceOrAuthToDsEntry(store, auth) expect(actual).toEqual(expected) @@ -2051,12 +2051,27 @@ describe('serializers/paw/Serializer.js', () => { it('should work', () => { const pawReq = { setHeader: () => {} } spyOn(pawReq, 'setHeader').andReturn(123) - const auth = 'some dynamic string' + const authData = { variable: 'some dynamic string', auth: new Auth.Basic() } + + const expected = pawReq + const actual = __internals__.addAuthToRequest(pawReq, authData) + + expect(pawReq.setHeader).toHaveBeenCalledWith('Authorization', authData.variable) + expect(actual).toEqual(expected) + }) + + it('should work with ApiKeys custom headers', () => { + const pawReq = { setHeader: () => {} } + spyOn(pawReq, 'setHeader').andReturn(123) + const authData = { + variable: 'some dynamic string', + auth: new Auth.ApiKey({ name: 'X-Auth-Token' }) + } const expected = pawReq - const actual = __internals__.addAuthToRequest(pawReq, auth) + const actual = __internals__.addAuthToRequest(pawReq, authData) - expect(pawReq.setHeader).toHaveBeenCalledWith('Authorization', auth) + expect(pawReq.setHeader).toHaveBeenCalledWith('X-Auth-Token', authData.variable) expect(actual).toEqual(expected) }) }) From ada2adbae3affb8f3b870c052a15717dea76651a Mon Sep 17 00:00:00 2001 From: JonathanMontane Date: Thu, 14 Sep 2017 10:49:15 +0200 Subject: [PATCH 04/19] fixed pathname bug for very weird urls --- src/parsers/postman/v2.0/Parser.js | 2 +- .../postman/v2.0/__tests__/Parser.spec.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/parsers/postman/v2.0/Parser.js b/src/parsers/postman/v2.0/Parser.js index 52b8980..401546f 100644 --- a/src/parsers/postman/v2.0/Parser.js +++ b/src/parsers/postman/v2.0/Parser.js @@ -478,7 +478,7 @@ methods.addHostEntryToHostMap = (hostMap, { key, value }) => { const hostname = key.get('hostname') ? key.get('hostname').generate(List([ '{{', '}}' ])) : '' const port = key.get('port') ? ':' + key.get('port').generate(List([ '{{', '}}' ])) : '' const host = hostname + port - const pathname = key.get('pathname').generate(List([ '{{', '}}' ])) + const pathname = key.get('pathname') ? key.get('pathname').generate(List([ '{{', '}}' ])) : '' if (!hostMap[host]) { hostMap[host] = { entries: [], lcPathname: pathname.split('/') } diff --git a/src/parsers/postman/v2.0/__tests__/Parser.spec.js b/src/parsers/postman/v2.0/__tests__/Parser.spec.js index dd36787..b2cb0c1 100644 --- a/src/parsers/postman/v2.0/__tests__/Parser.spec.js +++ b/src/parsers/postman/v2.0/__tests__/Parser.spec.js @@ -960,6 +960,13 @@ describe('parsers/postman/v2.0/Parser.js', () => { variableDelimiters: List([ '{{', '}}', ':' ]) }), value: 321 + }, + { + key: new URL({ + url: 'staging.paw.cloud', + variableDelimiters: List([ '{{', '}}', ':' ]) + }), + value: 123 } ] const expected = { @@ -1017,6 +1024,18 @@ describe('parsers/postman/v2.0/Parser.js', () => { } ], lcPathname: [ '', 'users', '321' ] + }, + 'staging.paw.cloud': { + entries: [ + { + key: new URL({ + url: 'staging.paw.cloud', + variableDelimiters: List([ '{{', '}}', ':' ]) + }), + value: 123 + } + ], + lcPathname: [ '' ] } } From ea91a4709e67cd10adf21acb2e1f7a60572ea757 Mon Sep 17 00:00:00 2001 From: Jonathan Montane Date: Thu, 28 Sep 2017 07:53:11 +0200 Subject: [PATCH 05/19] Fixed wrong folder for webworker output --- configs/webworker/webpack.config.babel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/webworker/webpack.config.babel.js b/configs/webworker/webpack.config.babel.js index f47ef76..df6072b 100644 --- a/configs/webworker/webpack.config.babel.js +++ b/configs/webworker/webpack.config.babel.js @@ -4,7 +4,7 @@ const config = { target: 'webworker', entry: path.resolve(__dirname, './api-flow.js'), output: { - path: path.resolve(__dirname, '../../../dist/node/'), + path: path.resolve(__dirname, '../../../dist/webworker/'), filename: 'api-flow.js', libraryTarget: 'umd' }, From 3df668055db70d693a5e5b2f7a1ba6a6ddfe2a66 Mon Sep 17 00:00:00 2001 From: JonathanMontane Date: Thu, 5 Oct 2017 23:40:15 +0200 Subject: [PATCH 06/19] fixed missing postman loader, parser, and serializers from configs --- configs/node/api-flow-config.js | 12 +++++++++--- configs/web/api-flow-config.js | 12 +++++++++--- configs/webworker/api-flow-config.js | 12 +++++++++--- src/serializers/postman/v2.0/Serializer.js | 2 +- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/configs/node/api-flow-config.js b/configs/node/api-flow-config.js index 97b2d80..f6cad0f 100644 --- a/configs/node/api-flow-config.js +++ b/configs/node/api-flow-config.js @@ -2,28 +2,34 @@ import Environment from '../../src/environments/node/Environment' import SwaggerLoader from '../../src/loaders/swagger/Loader' import RAMLLoader from '../../src/loaders/raml/Loader' +import PostmanV2Loader from '../../src/loaders/postman/v2.0/Loader' import SwaggerV2Parser from '../../src/parsers/swagger/v2.0/Parser' import RAMLV1Parser from '../../src/parsers/raml/v1.0/Parser' +import PostmanV2Parser from '../../src/loaders/postman/v2.0/Parser' import SwaggerV2Serializer from '../../src/serializers/swagger/v2.0/Serializer' import RAMLV1Serializer from '../../src/serializers/raml/v1.0/Serializer' +import PostmanV2Serializer from '../../src/serializers/postman/v2.0/Serializer' import InternalSerializer from '../../src/serializers/internal/Serializer' export const loaders = [ SwaggerLoader, - RAMLLoader + RAMLLoader, + PostmanV2Loader ] export const parsers = [ SwaggerV2Parser, - RAMLV1Parser + RAMLV1Parser, + PostmanV2Parser ] export const serializers = [ SwaggerV2Serializer, RAMLV1Serializer, - InternalSerializer + InternalSerializer, + PostmanV2Serializer ] export const environment = Environment diff --git a/configs/web/api-flow-config.js b/configs/web/api-flow-config.js index 81aa211..12e25e9 100644 --- a/configs/web/api-flow-config.js +++ b/configs/web/api-flow-config.js @@ -2,28 +2,34 @@ import Environment from '../../src/environments/web/Environment' import SwaggerLoader from '../../src/loaders/swagger/Loader' import RAMLLoader from '../../src/loaders/raml/Loader' +import PostmanV2Loader from '../../src/loaders/postman/v2.0/Loader' import SwaggerV2Parser from '../../src/parsers/swagger/v2.0/Parser' import RAMLV1Parser from '../../src/parsers/raml/v1.0/Parser' +import PostmanV2Parser from '../../src/loaders/postman/v2.0/Parser' import SwaggerV2Serializer from '../../src/serializers/swagger/v2.0/Serializer' import RAMLV1Serializer from '../../src/serializers/raml/v1.0/Serializer' +import PostmanV2Serializer from '../../src/serializers/postman/v2.0/Serializer' import InternalSerializer from '../../src/serializers/internal/Serializer' export const loaders = [ SwaggerLoader, - RAMLLoader + RAMLLoader, + PostmanV2Loader ] export const parsers = [ SwaggerV2Parser, - RAMLV1Parser + RAMLV1Parser, + PostmanV2Parser ] export const serializers = [ SwaggerV2Serializer, RAMLV1Serializer, - InternalSerializer + InternalSerializer, + PostmanV2Serializer ] export const environment = Environment diff --git a/configs/webworker/api-flow-config.js b/configs/webworker/api-flow-config.js index 81aa211..12e25e9 100644 --- a/configs/webworker/api-flow-config.js +++ b/configs/webworker/api-flow-config.js @@ -2,28 +2,34 @@ import Environment from '../../src/environments/web/Environment' import SwaggerLoader from '../../src/loaders/swagger/Loader' import RAMLLoader from '../../src/loaders/raml/Loader' +import PostmanV2Loader from '../../src/loaders/postman/v2.0/Loader' import SwaggerV2Parser from '../../src/parsers/swagger/v2.0/Parser' import RAMLV1Parser from '../../src/parsers/raml/v1.0/Parser' +import PostmanV2Parser from '../../src/loaders/postman/v2.0/Parser' import SwaggerV2Serializer from '../../src/serializers/swagger/v2.0/Serializer' import RAMLV1Serializer from '../../src/serializers/raml/v1.0/Serializer' +import PostmanV2Serializer from '../../src/serializers/postman/v2.0/Serializer' import InternalSerializer from '../../src/serializers/internal/Serializer' export const loaders = [ SwaggerLoader, - RAMLLoader + RAMLLoader, + PostmanV2Loader ] export const parsers = [ SwaggerV2Parser, - RAMLV1Parser + RAMLV1Parser, + PostmanV2Parser ] export const serializers = [ SwaggerV2Serializer, RAMLV1Serializer, - InternalSerializer + InternalSerializer, + PostmanV2Serializer ] export const environment = Environment diff --git a/src/serializers/postman/v2.0/Serializer.js b/src/serializers/postman/v2.0/Serializer.js index 1920695..70f68f1 100644 --- a/src/serializers/postman/v2.0/Serializer.js +++ b/src/serializers/postman/v2.0/Serializer.js @@ -35,7 +35,7 @@ import Auth from '../../../models/Auth' import { convertEntryListInMap } from '../../../utils/fp-utils' const __meta__ = { - format: 'postman', + format: 'postman-collection', version: 'v2.0' } From 3ef1dca03a066522449e5299bbd6f37e738a40ec Mon Sep 17 00:00:00 2001 From: JonathanMontane Date: Thu, 5 Oct 2017 23:56:42 +0200 Subject: [PATCH 07/19] loaders now defaults to fsResolution instead of httpResolution --- src/loaders/internal/Loader.js | 7 ++++--- src/loaders/postman/v2.0/Loader.js | 6 +++--- src/loaders/swagger/Loader.js | 7 ++++--- src/loaders/template/v1.0/Loader.js | 6 +++--- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/loaders/internal/Loader.js b/src/loaders/internal/Loader.js index efdf747..cabd751 100644 --- a/src/loaders/internal/Loader.js +++ b/src/loaders/internal/Loader.js @@ -70,11 +70,12 @@ methods.parseJSON = (str) => { methods.resolve = (options, uri, { $ref = '' } = {}) => { const uriToLoad = resolve(uri, $ref) - if (parse(uriToLoad).protocol === 'file:') { - return options.fsResolver.resolve(uriToLoad.split('#')[0]) + const protocol = parse(uriToLoad).protocol + if (protocol && protocol.substr(0,4) === 'http') { + return options.httpResolver.resolve(uriToLoad.split('#')[0]) } - return options.httpResolver.resolve(uriToLoad.split('#')[0]) + return options.fsResolver.resolve(uriToLoad.split('#')[0]) } diff --git a/src/loaders/postman/v2.0/Loader.js b/src/loaders/postman/v2.0/Loader.js index 237398d..8865593 100644 --- a/src/loaders/postman/v2.0/Loader.js +++ b/src/loaders/postman/v2.0/Loader.js @@ -87,11 +87,11 @@ methods.isParsable = (content) => { methods.resolve = (options, uri, { $ref = '' } = {}) => { const uriToLoad = resolve(uri, $ref) const protocol = parse(uriToLoad).protocol - if (protocol === 'file:' || protocol === 'file') { - return options.fsResolver.resolve(uriToLoad.split('#')[0]) + if (protocol && protocol.substr(0,4) === 'http') { + return options.httpResolver.resolve(uriToLoad.split('#')[0]) } - return options.httpResolver.resolve(uriToLoad.split('#')[0]) + return options.fsResolver.resolve(uriToLoad.split('#')[0]) } methods.normalizeRequestItem = (item) => { diff --git a/src/loaders/swagger/Loader.js b/src/loaders/swagger/Loader.js index ff66f33..0bfd644 100644 --- a/src/loaders/swagger/Loader.js +++ b/src/loaders/swagger/Loader.js @@ -122,11 +122,12 @@ methods.traverse = (content, { $ref = '#/' } = {}) => { methods.resolve = (options, uri, { $ref = '' } = {}) => { const uriToLoad = resolve(uri, $ref) - if (parse(uriToLoad).protocol === 'file:') { - return options.fsResolver.resolve(uriToLoad.split('#')[0]) + const protocol = parse(uriToLoad).protocol + if (protocol && protocol.substr(0,4) === 'http') { + return options.httpResolver.resolve(uriToLoad.split('#')[0]) } - return options.httpResolver.resolve(uriToLoad.split('#')[0]) + return options.fsResolver.resolve(uriToLoad.split('#')[0]) } methods.objectMap = (obj, func) => { diff --git a/src/loaders/template/v1.0/Loader.js b/src/loaders/template/v1.0/Loader.js index 1509f5d..4846aa6 100644 --- a/src/loaders/template/v1.0/Loader.js +++ b/src/loaders/template/v1.0/Loader.js @@ -125,11 +125,11 @@ methods.isParsable = (content) => { methods.resolve = (options, uri, { $ref = '' } = {}) => { const uriToLoad = resolve(uri, $ref) const protocol = parse(uriToLoad).protocol - if (protocol === 'file:' || protocol === 'file' || !protocol) { - return options.fsResolver.resolve(uriToLoad.split('#')[0]) + if (protocol && protocol.substr(0,4) === 'http') { + return options.httpResolver.resolve(uriToLoad.split('#')[0]) } - return options.httpResolver.resolve(uriToLoad.split('#')[0]) + return options.fsResolver.resolve(uriToLoad.split('#')[0]) } /** From aba4a50c659d1486e71d8f43088038263edc08fa Mon Sep 17 00:00:00 2001 From: JonathanMontane Date: Fri, 6 Oct 2017 00:06:58 +0200 Subject: [PATCH 08/19] linting --- src/loaders/internal/Loader.js | 2 +- src/loaders/postman/v2.0/Loader.js | 2 +- src/loaders/swagger/Loader.js | 2 +- src/loaders/template/v1.0/Loader.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/loaders/internal/Loader.js b/src/loaders/internal/Loader.js index cabd751..c4e033c 100644 --- a/src/loaders/internal/Loader.js +++ b/src/loaders/internal/Loader.js @@ -71,7 +71,7 @@ methods.parseJSON = (str) => { methods.resolve = (options, uri, { $ref = '' } = {}) => { const uriToLoad = resolve(uri, $ref) const protocol = parse(uriToLoad).protocol - if (protocol && protocol.substr(0,4) === 'http') { + if (protocol && protocol.substr(0, 4) === 'http') { return options.httpResolver.resolve(uriToLoad.split('#')[0]) } diff --git a/src/loaders/postman/v2.0/Loader.js b/src/loaders/postman/v2.0/Loader.js index 8865593..96f8481 100644 --- a/src/loaders/postman/v2.0/Loader.js +++ b/src/loaders/postman/v2.0/Loader.js @@ -87,7 +87,7 @@ methods.isParsable = (content) => { methods.resolve = (options, uri, { $ref = '' } = {}) => { const uriToLoad = resolve(uri, $ref) const protocol = parse(uriToLoad).protocol - if (protocol && protocol.substr(0,4) === 'http') { + if (protocol && protocol.substr(0, 4) === 'http') { return options.httpResolver.resolve(uriToLoad.split('#')[0]) } diff --git a/src/loaders/swagger/Loader.js b/src/loaders/swagger/Loader.js index 0bfd644..159e516 100644 --- a/src/loaders/swagger/Loader.js +++ b/src/loaders/swagger/Loader.js @@ -123,7 +123,7 @@ methods.traverse = (content, { $ref = '#/' } = {}) => { methods.resolve = (options, uri, { $ref = '' } = {}) => { const uriToLoad = resolve(uri, $ref) const protocol = parse(uriToLoad).protocol - if (protocol && protocol.substr(0,4) === 'http') { + if (protocol && protocol.substr(0, 4) === 'http') { return options.httpResolver.resolve(uriToLoad.split('#')[0]) } diff --git a/src/loaders/template/v1.0/Loader.js b/src/loaders/template/v1.0/Loader.js index 4846aa6..7ca25c7 100644 --- a/src/loaders/template/v1.0/Loader.js +++ b/src/loaders/template/v1.0/Loader.js @@ -125,7 +125,7 @@ methods.isParsable = (content) => { methods.resolve = (options, uri, { $ref = '' } = {}) => { const uriToLoad = resolve(uri, $ref) const protocol = parse(uriToLoad).protocol - if (protocol && protocol.substr(0,4) === 'http') { + if (protocol && protocol.substr(0, 4) === 'http') { return options.httpResolver.resolve(uriToLoad.split('#')[0]) } From 905b69f33f9ac43f6b03641ea001ed42b9da799b Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Tue, 10 Oct 2017 14:21:33 -0400 Subject: [PATCH 09/19] Postman Collection loaders, serializers and parsers Still not entirely working but its closer --- configs/node/api-flow-config.js | 12 ++++++------ configs/web/api-flow-config.js | 12 ++++++------ configs/webworker/api-flow-config.js | 12 ++++++------ src/api-flow-config.js | 4 ++-- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/configs/node/api-flow-config.js b/configs/node/api-flow-config.js index f6cad0f..66b58de 100644 --- a/configs/node/api-flow-config.js +++ b/configs/node/api-flow-config.js @@ -2,34 +2,34 @@ import Environment from '../../src/environments/node/Environment' import SwaggerLoader from '../../src/loaders/swagger/Loader' import RAMLLoader from '../../src/loaders/raml/Loader' -import PostmanV2Loader from '../../src/loaders/postman/v2.0/Loader' +import PostmanCollectionV2Loader from '../../src/loaders/postman/v2.0/Loader' import SwaggerV2Parser from '../../src/parsers/swagger/v2.0/Parser' import RAMLV1Parser from '../../src/parsers/raml/v1.0/Parser' -import PostmanV2Parser from '../../src/loaders/postman/v2.0/Parser' +import PostmanCollectionV2Parser from '../../src/parsers/postman/v2.0/Parser' import SwaggerV2Serializer from '../../src/serializers/swagger/v2.0/Serializer' import RAMLV1Serializer from '../../src/serializers/raml/v1.0/Serializer' -import PostmanV2Serializer from '../../src/serializers/postman/v2.0/Serializer' +import PostmanCollectionV2Serializer from '../../src/serializers/postman/v2.0/Serializer' import InternalSerializer from '../../src/serializers/internal/Serializer' export const loaders = [ SwaggerLoader, RAMLLoader, - PostmanV2Loader + PostmanCollectionV2Loader ] export const parsers = [ SwaggerV2Parser, RAMLV1Parser, - PostmanV2Parser + PostmanCollectionV2Parser ] export const serializers = [ SwaggerV2Serializer, RAMLV1Serializer, InternalSerializer, - PostmanV2Serializer + PostmanCollectionV2Serializer ] export const environment = Environment diff --git a/configs/web/api-flow-config.js b/configs/web/api-flow-config.js index 12e25e9..25a0ace 100644 --- a/configs/web/api-flow-config.js +++ b/configs/web/api-flow-config.js @@ -2,34 +2,34 @@ import Environment from '../../src/environments/web/Environment' import SwaggerLoader from '../../src/loaders/swagger/Loader' import RAMLLoader from '../../src/loaders/raml/Loader' -import PostmanV2Loader from '../../src/loaders/postman/v2.0/Loader' +import PostmanCollectionV2Loader from '../../src/loaders/postman/v2.0/Loader' import SwaggerV2Parser from '../../src/parsers/swagger/v2.0/Parser' import RAMLV1Parser from '../../src/parsers/raml/v1.0/Parser' -import PostmanV2Parser from '../../src/loaders/postman/v2.0/Parser' +import PostmanCollectionV2Parser from '../../src/parsers/postman/v2.0/Parser' import SwaggerV2Serializer from '../../src/serializers/swagger/v2.0/Serializer' import RAMLV1Serializer from '../../src/serializers/raml/v1.0/Serializer' -import PostmanV2Serializer from '../../src/serializers/postman/v2.0/Serializer' +import PostmanCollectionV2Serializer from '../../src/serializers/postman/v2.0/Serializer' import InternalSerializer from '../../src/serializers/internal/Serializer' export const loaders = [ SwaggerLoader, RAMLLoader, - PostmanV2Loader + PostmanCollectionV2Loader ] export const parsers = [ SwaggerV2Parser, RAMLV1Parser, - PostmanV2Parser + PostmanCollectionV2Parser ] export const serializers = [ SwaggerV2Serializer, RAMLV1Serializer, InternalSerializer, - PostmanV2Serializer + PostmanCollectionV2Serializer ] export const environment = Environment diff --git a/configs/webworker/api-flow-config.js b/configs/webworker/api-flow-config.js index 12e25e9..25a0ace 100644 --- a/configs/webworker/api-flow-config.js +++ b/configs/webworker/api-flow-config.js @@ -2,34 +2,34 @@ import Environment from '../../src/environments/web/Environment' import SwaggerLoader from '../../src/loaders/swagger/Loader' import RAMLLoader from '../../src/loaders/raml/Loader' -import PostmanV2Loader from '../../src/loaders/postman/v2.0/Loader' +import PostmanCollectionV2Loader from '../../src/loaders/postman/v2.0/Loader' import SwaggerV2Parser from '../../src/parsers/swagger/v2.0/Parser' import RAMLV1Parser from '../../src/parsers/raml/v1.0/Parser' -import PostmanV2Parser from '../../src/loaders/postman/v2.0/Parser' +import PostmanCollectionV2Parser from '../../src/parsers/postman/v2.0/Parser' import SwaggerV2Serializer from '../../src/serializers/swagger/v2.0/Serializer' import RAMLV1Serializer from '../../src/serializers/raml/v1.0/Serializer' -import PostmanV2Serializer from '../../src/serializers/postman/v2.0/Serializer' +import PostmanCollectionV2Serializer from '../../src/serializers/postman/v2.0/Serializer' import InternalSerializer from '../../src/serializers/internal/Serializer' export const loaders = [ SwaggerLoader, RAMLLoader, - PostmanV2Loader + PostmanCollectionV2Loader ] export const parsers = [ SwaggerV2Parser, RAMLV1Parser, - PostmanV2Parser + PostmanCollectionV2Parser ] export const serializers = [ SwaggerV2Serializer, RAMLV1Serializer, InternalSerializer, - PostmanV2Serializer + PostmanCollectionV2Serializer ] export const environment = Environment diff --git a/src/api-flow-config.js b/src/api-flow-config.js index f7500aa..5d7b0ce 100644 --- a/src/api-flow-config.js +++ b/src/api-flow-config.js @@ -13,7 +13,7 @@ import PostmanCollectionV2Parser from './parsers/postman/v2.0/Parser' import SwaggerV2Serializer from './serializers/swagger/v2.0/Serializer' import RAMLV1Serializer from './serializers/raml/v1.0/Serializer' import InternalSerializer from './serializers/internal/Serializer' -import PostmanV2Serializer from './serializers/postman/v2.0/Serializer' +import PostmanCollectionV2Serializer from './serializers/postman/v2.0/Serializer' import ApiBlueprint1ASerializer from './serializers/api-blueprint/1A/Serializer' export const loaders = [ @@ -34,7 +34,7 @@ export const serializers = [ SwaggerV2Serializer, RAMLV1Serializer, InternalSerializer, - PostmanV2Serializer, + PostmanCollectionV2Serializer, ApiBlueprint1ASerializer ] From 1b8beb2b5e33c5447df81967660b07f34b9e558a Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Sat, 26 Aug 2017 08:30:59 +0100 Subject: [PATCH 10/19] Fixed the installation instructions The README talked a bit too much about Paw, which is not what this library is going to be used for by the community at large. It also focused on compile instructions over recommending npm/yarn installation. ALSO the compile instructions were invalid, and talked about make install (doesnt exist!). --- README.md | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 4e0b4f2..8b45947 100644 --- a/README.md +++ b/README.md @@ -21,43 +21,52 @@ We intend to support: - and many more. ## Installation -### from a cloned repository -just run +You can install this library in two different ways. + + +### Install via NPM/Yarn + +```shell +$ yarn add api-flow +# or +$ npm install api-flow +``` + +### Install from source + +Just run: ```sh git clone https://github.com/luckymarmot/API-Flow.git cd API-Flow -make install +yarn install +make ``` -This will install the node module dependencies - -## Building the different libraries -### node, web, and webworker - -run the following command to build API-Flow for the different environments that you need +This will install the node module dependencies, but you will need to build API-Flow for the different [environments](src/environments) that you need: ```sh # use TARGET="node" if you only want the node library make runners TARGET="node web webworker" ``` -### Paw - -You can use the following command to add the different extensions to Paw +You can use the following command to compile different extensions. ```sh # use TARGET="swagger" if you only want the swagger bindings make transfer TARGET="swagger raml1 postman2" ``` -## Using the npm module -### as a standard library +## Usage + +### Standard Library ```js -const ApiFlow = require('api-flow'); // if from npm -const ApiFlow = require('./dist/node/api-flow.js'); // if from `make runners TARGET="node"` +const ApiFlow = require('api-flow').default; // if from yarn/npm +const ApiFlow = require('./dist/node/api-flow.js').default; // if from `make runners TARGET="node"` + +const path = require('path'); const options = { source: { From e0eaf63b30ef94cc9144f054d8f9d5af208af3bf Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Tue, 5 Dec 2017 12:56:52 -0500 Subject: [PATCH 11/19] Created a clear TODO for anyone looking Linked to issues where they exist, and removed CLI usage (as it does not exist). --- README.md | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 8b45947..3a370af 100644 --- a/README.md +++ b/README.md @@ -4,20 +4,23 @@ A flow written in ES6 using Immutable to convert between API description formats (Swagger, etc.) and other programs such as cURL command lines. -## What formats are supported and what will be in the future +## Format Support + We currently support: -- `Swagger v2.0 (in/out)` -- `RAML v1.0 (in/out)` -- `Postman Collection v2.0 (in/out)` -- `Paw v3.1 (in/out)` + +- Swagger v2.0 (in/out) +- RAML v1.0 (in/out) +- Postman Collection v2.0 (in/out) +- Paw v3.1 (in/out) We intend to support: -- `Swagger v3.0` -- `RAML v0.8` -- `Postman Collection v1.0` -- `Postman Dump v1.0` -- `Insomnia v3.0` -- `Api-Blueprint` + +- Swagger v3.0 +- RAML v0.8 +- Postman Collection v1.0 +- Postman Dump v1.0 +- Insomnia v3.0 +- API Blueprint - and many more. ## Installation @@ -89,11 +92,6 @@ promise.then((data) => { }) ``` -### Using as a CLI (coming soon) -```sh -node ./bin/api-flow.js some_swagger.json -f swagger -t raml > converted.yml -``` - ### User Interface API-Flow is one of the main components of [Console.REST](https://github.com/luckymarmot/console-rest). If you're an API user, you can easily use [https://console.rest/](https://console.rest/) to convert API description files. If you're an API provider, you can add a button to your API docs to let your users open and play with your API in client apps including Paw or Postman. From 0cca354a329eeea1b21ea5f02f3294247078f3e8 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Thu, 30 Nov 2017 12:49:10 -0500 Subject: [PATCH 12/19] Hunting through travis.yml isnt ideal --- CONTRIBUTING.md | 14 ++++++++++++++ README.md | 4 +++- 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..59ab549 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,14 @@ +PRs are always welcome, and we'll be happy to merge them if the test suite passes. + +To run the entire test suite would take a long time, so we've broken it down into various groups: + +``` shell +TEST_TARGET=lint make test +TEST_TARGET=unit make test +TEST_TARGET=e2e make test +TEST_TARGET=cov make test +``` + +All of these will be run by Travis, but you could save the ice caps from melting a little by running at least `unit` and `e2e` before you push. + +Our sole requirement is that organizations that want to extend API-Flow to support their format write both a parser and a serializer, and not simply a serializer. diff --git a/README.md b/README.md index 4e0b4f2..cbe9e28 100644 --- a/README.md +++ b/README.md @@ -91,10 +91,12 @@ API-Flow is one of the main components of [Console.REST](https://github.com/luck ## Contributing -PRs are welcomed! +Read [CONTRIBUTING.md](CONTRIBUTING.md) for more tips on testing and contributing. + Our sole requirement is that organizations that want to extend API-Flow to support their format write both a parser and a serializer, and not simply a serializer. ## Documentation + You can find more information about the internal structure of API-Flow in [src](https://github.com/luckymarmot/API-Flow/tree/develop/src). We've also created a set of templates to help speed up the extension process: [loader](https://github.com/luckymarmot/API-Flow/tree/develop/src/loaders/template/v1.0), [parser](https://github.com/luckymarmot/API-Flow/tree/develop/src/parsers/template/v1.0/), and [environment](https://github.com/luckymarmot/API-Flow/tree/develop/src/environments/template) ## License From 4cd8c6a5b55412253031d080a53d22babecc713c Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Tue, 5 Dec 2017 13:16:40 -0500 Subject: [PATCH 13/19] Local links work well for GitHub READMEs A few forks were updating these links and causing conflicts, so lets just use local links :D --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cbe9e28..a71bca8 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ Our sole requirement is that organizations that want to extend API-Flow to suppo ## Documentation -You can find more information about the internal structure of API-Flow in [src](https://github.com/luckymarmot/API-Flow/tree/develop/src). We've also created a set of templates to help speed up the extension process: [loader](https://github.com/luckymarmot/API-Flow/tree/develop/src/loaders/template/v1.0), [parser](https://github.com/luckymarmot/API-Flow/tree/develop/src/parsers/template/v1.0/), and [environment](https://github.com/luckymarmot/API-Flow/tree/develop/src/environments/template) +You can find more information about the internal structure of API-Flow in [src](src). We've also created a set of templates to help speed up the extension process: [loader](src/loaders/template/v1.0), [parser](src/parsers/template/v1.0/), and [environment](src/environments/template) ## License From 833f96c0d5a91e7394945ef16635b0c3da6f4fd9 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Wed, 6 Dec 2017 16:07:06 -0500 Subject: [PATCH 14/19] For some reason the tests still pass --- testing/e2e/internal-postman2/test-case-0/output.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing/e2e/internal-postman2/test-case-0/output.json b/testing/e2e/internal-postman2/test-case-0/output.json index 91c1177..8759556 100644 --- a/testing/e2e/internal-postman2/test-case-0/output.json +++ b/testing/e2e/internal-postman2/test-case-0/output.json @@ -170,7 +170,7 @@ "header": [ { "key": "api_key", - "value": null + "value": "" }, { "key": "Content-Type", @@ -362,4 +362,4 @@ "name": "Content-Type" } ] -} \ No newline at end of file +} From 13576bbac0cb784dce0fbc843bf01370dab5b6b7 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Wed, 6 Dec 2017 16:11:39 -0500 Subject: [PATCH 15/19] Never make a header with value: null Empty string is valid, null is invalid. --- src/serializers/postman/v2.0/Serializer.js | 2 +- src/serializers/postman/v2.0/__tests__/Serializer.spec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/serializers/postman/v2.0/Serializer.js b/src/serializers/postman/v2.0/Serializer.js index 1920695..812e59b 100644 --- a/src/serializers/postman/v2.0/Serializer.js +++ b/src/serializers/postman/v2.0/Serializer.js @@ -620,7 +620,7 @@ methods.createHeaderFromParameter = (param) => { return { key, value: schema.enum[0] } } - return { key, value: null } + return { key, value: '' } } /** diff --git a/src/serializers/postman/v2.0/__tests__/Serializer.spec.js b/src/serializers/postman/v2.0/__tests__/Serializer.spec.js index 94ffeb4..711d41e 100644 --- a/src/serializers/postman/v2.0/__tests__/Serializer.spec.js +++ b/src/serializers/postman/v2.0/__tests__/Serializer.spec.js @@ -844,7 +844,7 @@ describe('serializers/swagger/v2.0/Serializer.js', () => { ] const expected = [ null, - { key: 123, value: null }, + { key: 123, value: '' }, { key: 234, value: 'abc' }, { key: 345, value: 'def' } ] From 6b5d75d5ea16f363fb1bc54fa7152f18075f8ddf Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Wed, 6 Dec 2017 17:01:44 -0500 Subject: [PATCH 16/19] Just be inconsistent like before --- configs/node/api-flow-config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/node/api-flow-config.js b/configs/node/api-flow-config.js index e575fc1..66b58de 100644 --- a/configs/node/api-flow-config.js +++ b/configs/node/api-flow-config.js @@ -1,7 +1,7 @@ import Environment from '../../src/environments/node/Environment' import SwaggerLoader from '../../src/loaders/swagger/Loader' -import RAMLV1Loader from '../../src/loaders/raml/Loader' +import RAMLLoader from '../../src/loaders/raml/Loader' import PostmanCollectionV2Loader from '../../src/loaders/postman/v2.0/Loader' import SwaggerV2Parser from '../../src/parsers/swagger/v2.0/Parser' From a2c79efbf7bf40395bd84281d1ec05597b9203ea Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Mon, 11 Dec 2017 17:18:20 -0500 Subject: [PATCH 17/19] Support example and x-example in Swagger Properties --- src/parsers/swagger/v2.0/Parser.js | 6 ++ .../swagger/v2.0/__tests__/Parser.spec.js | 70 ++++++++++++++++++- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/parsers/swagger/v2.0/Parser.js b/src/parsers/swagger/v2.0/Parser.js index a2f9043..5c30291 100644 --- a/src/parsers/swagger/v2.0/Parser.js +++ b/src/parsers/swagger/v2.0/Parser.js @@ -1252,6 +1252,12 @@ methods.convertParameterObjectIntoParameter = (parameterEntry) => { applicableContexts } + if (typeof parameter.example !== 'undefined') { + paramInstance.examples = List([parameter.example]) + } else if (typeof parameter['x-example'] !== 'undefined') { + paramInstance.examples = List([parameter['x-example']]) + } + if (parameter.type === 'array' && parameter.items) { const { value } = methods.convertParameterObjectIntoParameter({ key: null, diff --git a/src/parsers/swagger/v2.0/__tests__/Parser.spec.js b/src/parsers/swagger/v2.0/__tests__/Parser.spec.js index cd2469d..fa7faa7 100644 --- a/src/parsers/swagger/v2.0/__tests__/Parser.spec.js +++ b/src/parsers/swagger/v2.0/__tests__/Parser.spec.js @@ -2772,7 +2772,8 @@ describe('parsers/swagger/v2.0/Parser.js', () => { maximum: 321, minimum: 123, multipleOf: 5, - default: 100 + default: 100, + example: 12345 } } @@ -2787,6 +2788,9 @@ describe('parsers/swagger/v2.0/Parser.js', () => { required: true, type: 'integer', default: 100, + examples: List([ + 12345 + ]), constraints: List([ new Constraint.Maximum(321), new Constraint.Minimum(123), @@ -2816,7 +2820,8 @@ describe('parsers/swagger/v2.0/Parser.js', () => { maximum: 321, minimum: 123, multipleOf: 5, - default: 100 + default: 100, + example: 12345 } } } @@ -2838,6 +2843,7 @@ describe('parsers/swagger/v2.0/Parser.js', () => { required: true, type: 'integer', default: 100, + examples: List([12345]), constraints: List([ new Constraint.Maximum(321), new Constraint.Minimum(123), @@ -2920,6 +2926,66 @@ describe('parsers/swagger/v2.0/Parser.js', () => { const actual = inputs.map(input => __internals__.convertParameterObjectIntoParameter(input)) expect(actual).toEqual(expected) }) + + it('should respect x-example too', () => { + const inputs = [ + { + key: 'UserId', + value: { + name: 'userId', + in: 'query', + type: 'integer', + required: true, + 'x-example': 23456 + } + }, + { + key: 'ShowThing', + value: { + name: 'showThing', + in: 'query', + type: 'boolean', + 'x-example': false + } + } + ] + + const expected = [ + { + key: 'UserId', + value: new Parameter({ + key: 'userId', + name: 'userId', + in: 'queries', + uuid: 'UserId', + required: true, + type: 'integer', + examples: List([ + 23456 + ]), + constraints: List() + }) + }, + { + key: 'ShowThing', + value: new Parameter({ + key: 'showThing', + name: 'showThing', + in: 'queries', + uuid: 'ShowThing', + required: false, + type: 'boolean', + examples: List([ + false + ]), + constraints: List() + }) + } + ] + + const actual = inputs.map(input => __internals__.convertParameterObjectIntoParameter(input)) + expect(actual).toEqual(expected) + }) }) describe('@convertParameterObjectArrayIntoParameterMap', () => { From f4da01f067c5a730eca02ec1297fc3d04d2d4fc6 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Thu, 7 Dec 2017 14:36:15 -0500 Subject: [PATCH 18/19] Empty swagger response description is actually fine --- src/serializers/swagger/v2.0/Serializer.js | 16 +++++----------- .../swagger/v2.0/__tests__/Serializer.spec.js | 8 ++++---- testing/e2e/internal-swagger2/e2e.spec.js | 3 +-- .../internal-swagger2/test-case-1/output.json | 14 +++++++------- 4 files changed, 17 insertions(+), 24 deletions(-) diff --git a/src/serializers/swagger/v2.0/Serializer.js b/src/serializers/swagger/v2.0/Serializer.js index 0cf162b..8fc9052 100644 --- a/src/serializers/swagger/v2.0/Serializer.js +++ b/src/serializers/swagger/v2.0/Serializer.js @@ -463,18 +463,12 @@ methods.getSchemaFromResponse = (response) => { * @returns {SwaggerResponseObject} the corresponding swagger response object. */ methods.convertResponseRecordToResponseObject = (store, { key, value }) => { - const response = {} - - if (value.get('description')) { - response.description = value.get('description') - } - else { - response.description = 'no description was provided for this response' + const response = { + description: value.get('description') || '', + headers: methods.getHeadersFromResponse(store, value), + schema: methods.getSchemaFromResponse(value) } - response.headers = methods.getHeadersFromResponse(store, value) - response.schema = methods.getSchemaFromResponse(value) - return { key, value: response @@ -1123,7 +1117,7 @@ methods.getResponsesFromRequest = (store, request) => { if (Object.keys(responses).length === 0) { return { default: { - description: 'no response description was provided for this operation' + description: '' } } } diff --git a/src/serializers/swagger/v2.0/__tests__/Serializer.spec.js b/src/serializers/swagger/v2.0/__tests__/Serializer.spec.js index 055ab64..a036e25 100644 --- a/src/serializers/swagger/v2.0/__tests__/Serializer.spec.js +++ b/src/serializers/swagger/v2.0/__tests__/Serializer.spec.js @@ -653,7 +653,7 @@ describe('serializers/swagger/v2.0/Serializer.js', () => { } const expectedValue = { - description: 'no description was provided for this response', + description: '', headers: { userId: { type: 'string' }, petId: { type: 'number' } @@ -1703,21 +1703,21 @@ describe('serializers/swagger/v2.0/Serializer.js', () => { get: { responses: { default: { - description: 'no response description was provided for this operation' + description: '' } } }, post: { responses: { default: { - description: 'no response description was provided for this operation' + description: '' } } }, put: { responses: { default: { - description: 'no response description was provided for this operation' + description: '' } } } diff --git a/testing/e2e/internal-swagger2/e2e.spec.js b/testing/e2e/internal-swagger2/e2e.spec.js index 882e69a..f698da1 100644 --- a/testing/e2e/internal-swagger2/e2e.spec.js +++ b/testing/e2e/internal-swagger2/e2e.spec.js @@ -81,8 +81,7 @@ describe('internal -> swagger v2', () => { } catch (e) { console.error(e.stack) - expect(true).toEqual(false) - done() + done(new Error('unexpected error')) } /* eslint-enable no-console */ }) diff --git a/testing/e2e/internal-swagger2/test-case-1/output.json b/testing/e2e/internal-swagger2/test-case-1/output.json index 607cb61..3193461 100644 --- a/testing/e2e/internal-swagger2/test-case-1/output.json +++ b/testing/e2e/internal-swagger2/test-case-1/output.json @@ -29,7 +29,7 @@ ], "responses": { "default": { - "description": "no response description was provided for this operation" + "description": "" } }, "security": [ @@ -55,7 +55,7 @@ ], "responses": { "default": { - "description": "no response description was provided for this operation" + "description": "" } } } @@ -67,7 +67,7 @@ ], "responses": { "200": { - "description": "no description was provided for this response", + "description": "", "schema": { "$ref": "#/definitions/AnotherEntry" } @@ -81,7 +81,7 @@ ], "responses": { "200": { - "description": "no description was provided for this response", + "description": "", "schema": { "type": "object" } @@ -109,7 +109,7 @@ ], "responses": { "default": { - "description": "no response description was provided for this operation" + "description": "" } }, "security": [ @@ -129,7 +129,7 @@ ], "responses": { "default": { - "description": "no response description was provided for this operation" + "description": "" } } } @@ -142,7 +142,7 @@ ], "responses": { "200": { - "description": "no description was provided for this response", + "description": "", "schema": { "$ref": "#/definitions/SongsLib.Song" } From 655b752ebe3970f9271469a85097e7995db98b60 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Thu, 30 Nov 2017 13:10:21 -0500 Subject: [PATCH 19/19] Support URL objects with raw and not much else URL objects with raw but not a lot else were causing empty URLs, which shoved everything into / instead of gracefully figuring it out. Now if a URL is an object with "raw" it'll use the raw string. --- src/loaders/postman/v2.0/Loader.js | 24 +++++++++++++------ .../postman/v2.0/__tests__/Loader.spec.js | 8 ++++--- .../test-case-0/input.json | 11 --------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/loaders/postman/v2.0/Loader.js b/src/loaders/postman/v2.0/Loader.js index 96f8481..822e8e4 100644 --- a/src/loaders/postman/v2.0/Loader.js +++ b/src/loaders/postman/v2.0/Loader.js @@ -270,17 +270,27 @@ methods.normalizeRequestURL = (item) => { return item } - if (typeof item.request.url === 'string') { - item.request.urlString = item.request.url - item.request.url = methods.createPostmanURLObjectFromURLString(item.request.urlString) - } - else { - if (item.request.url && !item.request.url.domain && item.request.url.host) { - item.request.url.domain = item.request.url.host + let { url, urlString } = item.request + + if (typeof url === 'object') { + // Lets just use this raw string, its gonna have everything + if (url.raw) { + item.request.urlString = url.raw + item.request.url = methods.createPostmanURLObjectFromURLString(url.raw) + return item + } + // cater to some random bug before we do the object normalization + if (!url.domain && url.host) { + item.request.url.domain = url.host } item.request.urlString = methods.createPostmanURLStringFromURLObject(item.request.url) + return item } + // It's not an object, hope its a string or numeric that'll act like a string + item.request.urlString = url + item.request.url = methods.createPostmanURLObjectFromURLString(url) + return item } diff --git a/src/loaders/postman/v2.0/__tests__/Loader.spec.js b/src/loaders/postman/v2.0/__tests__/Loader.spec.js index 7131432..25153d0 100644 --- a/src/loaders/postman/v2.0/__tests__/Loader.spec.js +++ b/src/loaders/postman/v2.0/__tests__/Loader.spec.js @@ -436,12 +436,14 @@ describe('loaders/postman/v2.0/Loader.js', () => { const inputs = [ { request: { url: '123' } }, { request: { url: 234 } }, - { request: { url: { host: 345 } } } + { request: { url: { raw: 345 } } }, + { request: { url: { host: 456 } } } ] const expected = [ { request: { url: '123123', urlString: '123' } }, - { request: { url: 234, urlString: 234 / 2 } }, - { request: { url: { host: 345, domain: 345 }, urlString: 345 / 2 } } + { request: { url: 234 * 2, urlString: 234 } }, + { request: { url: 345 * 2, urlString: 345 } }, + { request: { url: { host: 456, domain: 456 }, urlString: 456 / 2 } } ] const actual = inputs.map(input => __internals__.normalizeRequestURL(input)) expect(actual).toEqual(expected) diff --git a/testing/e2e/postman-collection2-internal/test-case-0/input.json b/testing/e2e/postman-collection2-internal/test-case-0/input.json index e2a5e26..6d1ac07 100644 --- a/testing/e2e/postman-collection2-internal/test-case-0/input.json +++ b/testing/e2e/postman-collection2-internal/test-case-0/input.json @@ -362,17 +362,6 @@ "request": { "url": { "raw": "https://6-dot-authentiqio.appspot.com/scope/:job", - "protocol": "https", - "auth": {}, - "host": [ - "6-dot-authentiqio", - "appspot", - "com" - ], - "path": [ - "scope", - ":job" - ], "variable": [ { "value": "{{job}}",