From 753ee23ee4e0045377195de4976a203ad90ac281 Mon Sep 17 00:00:00 2001 From: JonathanMontane Date: Sun, 20 Aug 2017 11:21:31 +0200 Subject: [PATCH 1/6] 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 64f5527b2e16ba20c0f1286b52045382ad2965bc Mon Sep 17 00:00:00 2001 From: JonathanMontane Date: Thu, 14 Sep 2017 10:49:15 +0200 Subject: [PATCH 2/6] 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 1118c263c104740b1557bec7948a77dc621773dd Mon Sep 17 00:00:00 2001 From: JonathanMontane Date: Thu, 5 Oct 2017 23:40:15 +0200 Subject: [PATCH 3/6] 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 809235eca339e407f4c5132f0770b26d176fd8f5 Mon Sep 17 00:00:00 2001 From: JonathanMontane Date: Thu, 5 Oct 2017 23:56:42 +0200 Subject: [PATCH 4/6] 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 c46ad2f4244c8641c47c5d57e7135a42f72ed8d3 Mon Sep 17 00:00:00 2001 From: JonathanMontane Date: Fri, 6 Oct 2017 00:06:58 +0200 Subject: [PATCH 5/6] 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 210f6b2dc0a5873f34c46dce52ff4d134bceb3a5 Mon Sep 17 00:00:00 2001 From: Micha Mazaheri Date: Thu, 2 Nov 2017 13:16:05 +0900 Subject: [PATCH 6/6] Fix convertAuthFromReference in Paw serializer --- src/serializers/paw/Serializer.js | 6 +++--- src/serializers/paw/__tests__/Serializer.spec.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/serializers/paw/Serializer.js b/src/serializers/paw/Serializer.js index a5f0ff1..52032d2 100644 --- a/src/serializers/paw/Serializer.js +++ b/src/serializers/paw/Serializer.js @@ -1029,12 +1029,12 @@ methods.getContainerFromRequest = (request) => { * converts an auth into a DynamicString from a reference. * @param {Store} store: the store to use to resolve the reference * @param {Reference} reference: the reference to an EnvironmentVariable representing an Auth. - * @returns {DynamicString} the corresponding DynamicString + * @returns {{ variable: DynamicString, auth: Auth }} the corresponding DynamicString */ methods.convertAuthFromReference = (store, reference) => { - const variable = store.getIn([ 'auth', reference.get('uuid') ]) + const { variable, auth } = store.getIn([ 'auth', reference.get('uuid') ]) const ds = variable.createDynamicString() - return ds + return { variable: ds, auth: auth } } /** diff --git a/src/serializers/paw/__tests__/Serializer.spec.js b/src/serializers/paw/__tests__/Serializer.spec.js index 1eb1c31..2f12552 100644 --- a/src/serializers/paw/__tests__/Serializer.spec.js +++ b/src/serializers/paw/__tests__/Serializer.spec.js @@ -2010,12 +2010,12 @@ describe('serializers/paw/Serializer.js', () => { spyOn(variable, 'createDynamicString').andReturn(123) const store = new Store({ - auth: OrderedMap({ a: variable }) + auth: OrderedMap({ a: { variable: variable, auth: 'my-auth' } }) }) const ref = new Reference({ uuid: 'a' }) - const expected = 123 + const expected = { auth: 'my-auth', variable: 123 } const actual = __internals__.convertAuthFromReference(store, ref) expect(actual).toEqual(expected)